Flow is a type checker made by Facebook for checking JavaScript data types. It has many built-in data types we can use to annotate the types of variables and function parameters.
In this article, we’ll look at how to add Flow types to classes.
Class Definition
In Flow, the syntax for defining classes is the same as in normal JavaScript, but we add in types.
For example, we can write:
class Foo {
name: string;
constructor(name: string){
this.name= name;
}
foo(value: string): number {
return +value;
}
}
to define the Foo
class. The only difference between a regular JavaScript class and the class with the Flow syntax is the addition of type annotations in the fields and parameters and the return value types for methods.
In the code above, the type annotation for fields is:
name: string;
The value
parameter also has a type annotation added to it:
value: string
and we have the number
return type annotation after the signature of the foo
method.
We can also define class type definition without the content of the class as follows:
class Foo {
name: string;
foo: (string) => number;
static staticField: number;
}
In the code above, we have a string field name
, a method foo
that takes a string and returns a number and a static staticField
that is a number.
Then we can set the values for each outside the class definition as follows:
class Foo {
name: string;
foo: (string) => number;
static staticField: number;
static staticFoo: (string) => number;
}
const reusableFn = function(value: string): number {
return +value;
}
Foo.name = 'Joe';
Foo.prototype.foo = reusableFn
Foo.staticFoo = reusableFn
Foo.staticField = 1;
An instance method in JavaScript corresponds to its prototype’s methods. A static method is a method that’s shared between all instances like in other languages.
Generics
We can pass in generic type parameters to classes.
For example, we can write:
class Foo<A, B> {
name: A;
constructor(name: A) {
this.name = name;
}
foo(val: B): B {
return val;
}
}
Then to use the Foo
class, we can write:
let foo: Foo<string, number> = new Foo('Joe');
As we can see, defining classes in Flow isn’t that much different from JavaScript. The only difference is that we can add type annotations to fields, parameters and the return types of methods.
Also, we can make the types generic by passing in generic type markers to fields, parameters and return types.
With Flow, we can also have class definitions that only have the property and method identifiers and their corresponding types and signatures respectively.
Once the types are set, Flow will check the type if we set the values of these properties outside the class. Class methods are the same as their prototype’s methods. Static methods are just a method within the class, and it’s shared by all instances of the class.