跳到主要内容

类型互操作:TypeScript To Flow类型 — Numio

使用 flowgen 将 TypeScript 类型声明转换为 Flow 类型。readonly 变为 + 变型标记,导出的函数和类变为 "declare export",enum 变为精确的只读对象。

你发布了一个 TypeScript 库,同时想为使用 Flow 的用户提供 Flow 定义。

TypeScript

Flow

适用场景

  • 你发布了一个 TypeScript 库,同时想为使用 Flow 的用户提供 Flow 定义。
  • 一个 Flow 代码库依赖的包只有 .d.ts 类型,你需要一份 libdef 作为起点。

使用方法

  1. 将 TypeScript 声明(interface、type、declare 语句、enum)或带实现代码的模块粘贴到 TypeScript 面板。
  2. 代码会提交到 /api/typescript-to-flow。带函数体或初始化表达式的代码会先由 TypeScript 编译器精简为 .d.ts,再由 flowgen 转换并美化。
  3. 复制 Flow 输出,放进 flow-typed 文件夹或 .js.flow 文件,然后运行 flow 进行检查。

TypeScript

export type Theme = "light" | "dark";

export interface ButtonProps {
  label: string;
  theme?: Theme;
  readonly disabled: boolean;
  onClick(event: MouseEvent): void;
}

export declare function render(props: ButtonProps): string;
export enum Size { Small, Large }

Flow

export type Theme = "light" | "dark";
export interface ButtonProps {
  label: string;
  theme?: Theme;
  +disabled: boolean;
  onClick(event: MouseEvent): void;
}
declare export function render(props: ButtonProps): string;

declare export var Size: {|
  +Small: 0, // 0
  +Large: 1, // 1
|};

功能与限制

页面会把输入发送到服务器路由(/api/typescript-to-flow)进行转换,并不只在浏览器中处理。Next.js API 路由默认接受最大 1 MB 的请求体。

实现代码会先编译为声明,只保留带类型的 API:函数体消失,推断出的返回类型被补上,未导出且未被任何导出使用的值会被删除。

对象类型别名会变为以 "..." 结尾的非精确 Flow 对象;interface 仍是 interface。

数值 enum 会变为声明的精确对象,其值为只读字面量,例如 +Small: 0。

FAQ

readonly 属性如何转换?

readonly disabled: boolean 会变为 +disabled: boolean,即 Flow 的协变(只读)属性标记。

可以粘贴带实现的完整 .ts 文件吗?

可以。服务器会先生成声明,因此没有类型注解的箭头函数会得到推断出的类型,例如 declare export var greet: (u: User) => string。语法错误会直接报告,不会转换。

支持 TypeScript enum 吗?

支持,会转换为 declare export var Name: {| +Member: value |}。不会生成 Flow enum。

规范与参考资料