JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 20802926
  • Score
    100M100P100Q232106F
  • License MIT

Flow types for the Javascript AST

Package Exports

  • ast-types-flow
  • ast-types-flow/lib/types.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (ast-types-flow) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

ast-types-flow

Flow types for the Javascript AST. Based off of benjamn/ast-types.

Usage

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';
}

How it works

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:

  1. The type 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.
  2. Each entry in a disjoint union has to be structurally unique or Flow will have an error on the definition. That is why the private _Foo: void fields appear in the types.