跳到主要内容

声明文件:生成TypeScript声明 — Numio

像 tsc --declaration --emitDeclarationOnly 一样,从 TypeScript 源码生成 .d.ts 声明文件。函数体和初始化表达式会被移除,类的 private 成员只保留名称。

在构建包之前,预览某个库文件将要发布的公开类型接口。

TypeScript

TypeScript

适用场景

  • 在构建包之前,预览某个库文件将要发布的公开类型接口。
  • 你需要为单个模块手动维护一份 .d.ts,或为 TypeScript to Flow 工具准备只含声明的输入。

使用方法

  1. 将 TypeScript 模块粘贴到 TypeScript 面板。
  2. 代码会带着 isTS 和 declarationOnly 参数提交到 /api/flow-to-typescript,由 TypeScript 编译器在服务器上生成声明。
  3. 将声明复制到 .d.ts 文件。页面会用 Prettier 格式化,因此使用两个空格缩进且不带分号。

TypeScript

export interface CartItem { sku: string; price: number; qty: number }
export const TAX_RATE = 0.08;

export function subtotal(items: CartItem[]) {
  return items.reduce((sum, i) => sum + i.price * i.qty, 0);
}

export class Cart {
  private items: CartItem[] = [];
  constructor(public readonly currency = "USD") {}
  add(item: CartItem) {
    this.items.push(item);
    return this;
  }
}

TypeScript 声明 (.d.ts)

export interface CartItem {
  sku: string
  price: number
  qty: number
}
export declare const TAX_RATE = 0.08
export declare function subtotal(items: CartItem[]): number
export declare class Cart {
  readonly currency: string
  private items
  constructor(currency?: string)
  add(item: CartItem): this
}

功能与限制

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

编译器会加载 TypeScript 的 ES2020 和 DOM 库文件,因此 Promise、Date、Map 以及从内置方法推断出的返回类型(示例中 subtotal 为 number)都能正确写出。

语法错误会中止转换,并显示编译器消息(例如 TS1134 "Variable declaration expected")而不是输出。

每次输入都作为单个文件编译,不会解析从其他模块的导入。

FAQ

支持 async 函数吗?

支持。推断出的返回类型会包在 Promise 中,因此返回 Todo[] 的 async 函数会声明为 export declare function loadTodos(url: string): Promise<Todo[]>。

private 成员会怎样?

只保留名称,例如 "private items;",这样类的结构仍然一致,但不暴露其类型。

会保留参数默认值吗?

不会。带默认值的参数会变为可选参数,因此 constructor(public readonly currency = "USD") 会变为 constructor(currency?: string)。

规范与参考资料