Godefroy de Compreignac
Talk @ React Nantes - 28/06/2018
Avec React tout est Javascript
Les avantages sont multiples :
Le point noir pour beaucoup :
Javascript !
const subFamilyId = state.productReducer.products
.entries[id].infos
.subFamilies[0].id(tiré d'un vrai projet client)
Javascript est
faiblement typé et laxiste
Des solutions existent :
Typescript = Javascript + types
On peut comparer Typescript
à Babel + Flow sous stéroïdes
Analyse statique du code
Transpilation
Check dans l'éditeur et à la compilation
🡺 Moins d'erreurs au runtime
Vers Javascript dans la version souhaitée
🡺 Support des nouvelles syntaxes Ecmascript sur tous navigateurs
interface IAnimal {
name: string
legs: number
}
interface ICat extends IAnimal {
legs: 4,
color: string
}
const garfield: ICat = {
name: 'Garfield',
legs: 4,
color: 'orange'
}
function getName(animal: IAnimal): string {
return animal.name
}
function getColor(cat: ICat): string {
return cat.color
}
console.log('Hey', getName(garfield))
console.log('Cat color:', getColor(garfield))Exemple de typage :
Boilerplate de Microsoft, avec Redux :
create-react-app pour Typescript
https://github.com/Microsoft/TypeScript-React-Starter
https://github.com/wmonk/create-react-app-typescript
Parcel pour un petit projet
Webpack sinon
Support de Typescript par défaut
Pas plus de config que pour du JS standard.
Avant :
Après :
Ou, mieux que ts-loader :
awesome-typescript-loader
React a des typings à jour
à installer dans les devDependencies :
yarn add -D @types/react @types/react-dompackage.json
{
"name": "react-typescript",
"license": "MIT",
"scripts": {
"start": "parcel src/index.html -d public",
"build": "parcel build src/index.html --public-url ./"
},
"dependencies": {
"react": "^16.4.1",
"react-dom": "^16.4.1"
},
"devDependencies": {
"@types/react": "^16.4.1",
"@types/react-dom": "^16.0.6",
"parcel-bundler": "^1.9.2",
"tslint": "^5.10.0",
"typescript": "^2.9.2"
}
}
tsconfig.json
{
"compilerOptions": {
"jsx": "react",
"target": "es2015",
"module": "es2015",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
"noImplicitAny": true,
"noUnusedLocals": true,
"pretty": true,
"strictNullChecks": true
}
}
import React from 'react'
const App = () => (
<h1>Hello World!</h1>
)
export default App
import React from "react"
interface IProps {
firstname: string
age: number
}
const Person = ({ firstname, age }: IProps) => (
<div>
<h2>My name is {firstname}</h2>
<p>I'm {age}.</p>
</div>
)
export default Personconst App: React.SFC = () => (
<h1>Hello World!</h1>
)
// Pareil mais plus verbeux
const App: React.StatelessComponent = () => (
<h1>Hello World!</h1>
)
// Avec des props
const Person: React.SFC<IProps> = ({ firstname, age }) => (
<div>
<h2>My name is {firstname}</h2>
<p>I'm {age}.</p>
</div>
)(aucune différence ici avec du JS)
Avec Typescript on se sent assisté
et le refactoring devient un vrai plaisir
https://github.com/sw-yx/react-typescript-cheatsheet
React Typescript Cheatsheet
React
vs
Typescript
NPM
03/2015 - 06/2018
Google Trends
https://slides.com/godefroy_dc/react-typescript-2018-06
Slides
https://github.com/Godefroy/react-typescript-demo
Projet démo
Merci !
Co-fondateur de
Godefroy de Compreignac
Twitter : @Godefroy