...or why we actually decided to have two type checkers instead of one...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
From
To
ABOUT ME
- Ales Tsvil
- Frontend Architect in Elivar
- 8+ years of experience in web dev
- Functional Programming Enjoyer
- What are Static Types
- Flow
- TypeScript
- Flow vs TS
- So why Flow?
- And why TypeScript then?
- How to migrate
- Alternatives?
Static Types
- Require Types
- Compile Time Check
- Type Inference?
- Boilerplate?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550557/pasted-from-clipboard.png)
DYNAMIC TYPES
- No Types
- Runtime Check
- Less Code?
- Error Prone?
class Cat {
voice = () => "nope.";
}
class Dog {
voice = () => "woof!";
}
class NuclearSafetyInspector {
voice = () => "D'oh!";
}
function say(speaker) {
console.log(speaker.voice());
}
say(new Dog());
say(new Cat());
say(new NuclearSafetyInspector());
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550671/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/2537171/js.jpg)
class Cat {
voice = () => "nope.";
}
class Dog {
voice = () => "woof!";
}
class NuclearSafetyInspector {
voice = () => "D'oh!";
}
function say(speaker) {
console.log(speaker.voice());
}
say(new Dog());
say(new Cat());
say(new NuclearSafetyInspector());
Compiler Error!
interface CanSpeak {
voice(): string;
}
class Cat implements CanSpeak {
voice = () => "nope.";
}
class Dog implements CanSpeak {
voice = () => "woof!";
}
class NuclearSafetyInspector implements CanSpeak {
voice = () => "D'oh!";
}
function say(speaker: CanSpeak): void {
console.log(speaker.voice());
}
say(new Dog());
say(new Cat());
say(new NuclearSafetyInspector());
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550781/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
Static Type Checker
Created By Facebook
Has Type Inference
Plain JS is Valid Flow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
// @flow
class Cat {
voice = () => "meow!";
}
class NuclearSafetyInspector {
voice = () => "D'oh!";
}
function say(speaker) {
console.log(speaker.voice());
}
say(new Cat());
say(new NuclearSafetyInspector());
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550781/pasted-from-clipboard.png)
// @flow
class Cat {
voice = () => "nope.";
}
class NuclearSafetyInspector {
voice = () => "D'oh!";
}
class Empty {}
function say(speaker) {
console.log(speaker.voice());
}
say(new Cat());
say(new NuclearSafetyInspector());
say(new Empty());
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550889/pasted-from-clipboard.png)
// @flow
class Cat {
voice = () => "nope.";
}
class NuclearSafetyInspector {
voice = () => "D'oh!";
}
class Empty {}
function say(speaker) {
console.log(speaker.voice());
}
say(new Cat());
say(new NuclearSafetyInspector());
say(new Empty());
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550889/pasted-from-clipboard.png)
Strongly Typed Programming Language
Created By Microsoft
Has Type Inference
Plain JS is Valid TS
type CanSpeak = {
voice(): string,
}
class Cat {
voice = () => "meow!";
}
class NuclearSafetyInspector {
voice = () => "D'oh!";
}
function say(speaker: CanSpeak): void {
console.log(speaker.voice());
}
say(new Cat());
say(new NuclearSafetyInspector());
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550781/pasted-from-clipboard.png)
VS
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
Any
Object, Enum
Union, Intersection
Mixin
Functions
Generics
Optional
Casting
Inference
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
✅
and much more...
- Exact and Non-Exact Types
- Better Indexers
- Opaque Aliases
- Comments Syntax
- Type Spread Operator
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
- Conditional Types
- Declaration Merging
- Modules and Namespaces
- Function Overload
- Mapped Types
- Template Union Types
- Iterators and Generators
- Decorators and Metadata
- ...
THERE IS NO
SILVER BuLLET
const arr: number[] = [];
const a: number = arr[0];
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
// Command pattern imposibility
class A {
method1() {}
method2() {}
exec(command: "method1" | "method2") {
this[command](); //FlowError
// (this: any)[command]();
}
}
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9551020/pasted-from-clipboard.png)
class Animal {}
class Dog extends Animal { bark() {} }
class Cat extends Animal { meow() {} }
const cats: Array<Cat> = [new Cat(), new Cat()];
const animals: Array<Animal> = cats;
animals[1] = new Dog();
cats[1].meow(); //TypeError!
class Animal {}
class Dog extends Animal { bark() {} }
class Cat extends Animal { meow() {} }
const cats: Array<Cat> = [new Cat(), new Cat()];
const animals: Array<Animal> = cats;
animals[1] = new Dog();
cats[1].meow(); //TypeError!
ALlmightY Any
(null as any).method(); //TS
(null: any).method(); //Flow
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550522/pasted-from-clipboard.png)
![](https://media1.giphy.com/media/d10dMmzqCYqQ0/giphy.gif)
The reason to add more entropy
- Breaking Changes
- Exact Types
- Support (community, libs)
- Tooling
Breaking Changes
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9563646/pasted-from-clipboard.png)
Exact Types
type NonExact = {
some: number;
};
const a: NonExact = { some: 1, a: "2" };
type Exact = {|
some: number;
|};
const b: Exact = { some: 1, a: "2" }; // Cause Error
Exact Types
type NonExact = {
some: number;
};
const a: NonExact = { some: 1, a: "2" };
type Exact = {|
some: number;
|};
const b: Exact = { some: 1, a: "2" }; // Cause Error
Support
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550968/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550971/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550972/pasted-from-clipboard.png)
TYPINGS
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9551010/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9551011/pasted-from-clipboard.png)
HOW TO MIGRATE
![](https://s3.amazonaws.com/media-p.slid.es/uploads/391469/images/9550999/pasted-from-clipboard.png)
DEMO TIME!
MANY THANKS!
Flow vs TS
By diodredd
Flow vs TS
- 114