Irina Glushko 2389e7160b HW1 done | 3 years ago | |
---|---|---|
.. | ||
lib | 3 years ago | |
README.md | 3 years ago | |
package.json | 3 years ago |
Flow types for the Javascript AST. Based off of benjamn/ast-types.
First install ast-types-flow
via npm, then you can import any of the types
that are exported.
/* @flow */
import type {Node} from 'ast-types-flow';
function getName(node: Node): string {
switch (node.type) {
case 'Identifier':
return node.name;
case 'ClassDeclaration':
return node.id.name; // Error, id could be null.
case 'FunctionDeclaration':
return node.id.name; // Fine if it's always there.
case 'FunctionExpression':
if (node.id) {
return node.id.name; // Can refine id to make sure it exists.
} else {
return 'Unknown';
}
case 'Literal':
return node.name; // Error, Literals don't have names, don't be silly.
}
return 'Unknown';
}
A notion of "extends" is added to the Flow syntax via comments. A transform is included that will compile the source code into useful disjoint union types based on how the different types extend each other. For example:
type Node = {
common: string,
};
type Foo = {
// extends Node
foo: string,
};
type Bar = {
// extends Node
bar: number,
};
Will be transformed into:
type Node = {
type: 'Foo',
_Foo: void,
common: string,
foo: string,
} | {
type: 'Bar',
_Bar: void,
common: string,
bar: number,
};
type Foo = {
type: 'Foo',
_Foo: void,
common: string,
foo: string,
};
type Bar = {
type: 'Bar',
_Foo: void,
common: string,
bar: number,
};
A few things to note:
Node
would more ideally be compiled into Foo | Bar
but then the
disjoint union cannot be properly refined. For now we have to duplicate the
complete definitions._Foo: void
fields
appear in the types.