类型互操作:TypeScript To Flow类型 — Numio
使用 flowgen 将 TypeScript 类型声明转换为 Flow 类型。readonly 变为 + 变型标记,导出的函数和类变为 "declare export",enum 变为精确的只读对象。
你发布了一个 TypeScript 库,同时想为使用 Flow 的用户提供 Flow 定义。
适用场景
- 你发布了一个 TypeScript 库,同时想为使用 Flow 的用户提供 Flow 定义。
- 一个 Flow 代码库依赖的包只有 .d.ts 类型,你需要一份 libdef 作为起点。
使用方法
- 将 TypeScript 声明(interface、type、declare 语句、enum)或带实现代码的模块粘贴到 TypeScript 面板。
- 代码会提交到 /api/typescript-to-flow。带函数体或初始化表达式的代码会先由 TypeScript 编译器精简为 .d.ts,再由 flowgen 转换并美化。
- 复制 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。