Pular para o conteúdo

Gerar declarações TypeScript — Numio

Emite um arquivo de declarações .d.ts a partir de código TypeScript, como faz o tsc --declaration --emitDeclarationOnly. Corpos de função e inicializadores são removidos, e membros private de classes mantêm só o nome.

Você quer pré-visualizar a superfície pública de tipos que um arquivo de biblioteca vai publicar antes de fazer o build do pacote.

TypeScript

TypeScript

Quando usar

  • Você quer pré-visualizar a superfície pública de tipos que um arquivo de biblioteca vai publicar antes de fazer o build do pacote.
  • Você precisa de um .d.ts mantido à mão para um único módulo, ou de uma entrada só com declarações para a ferramenta TypeScript to Flow.

Como usar

  1. Cole um módulo TypeScript no painel TypeScript.
  2. O código é enviado para /api/flow-to-typescript com isTS e declarationOnly definidos, e o compilador TypeScript emite as declarações no servidor.
  3. Copie as declarações para um arquivo .d.ts. A página as formata com Prettier, então elas usam indentação de dois espaços e não têm ponto e vírgula.

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

Declarações 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
}

Detalhes e limitações

A página envia sua entrada para uma rota do servidor (/api/flow-to-typescript) para conversão; ela não é processada apenas no navegador. As rotas de API do Next.js aceitam por padrão corpos de requisição de até 1 MB.

O compilador carrega os arquivos de biblioteca ES2020 e DOM do TypeScript, então Promise, Date, Map e tipos de retorno inferidos de métodos nativos (number para subtotal no exemplo) são escritos corretamente.

Erros de sintaxe interrompem a conversão, e a mensagem do compilador, por exemplo TS1134 "Variable declaration expected", é exibida no lugar da saída.

Cada entrada é compilada como um único arquivo; imports de outros módulos não são resolvidos.

FAQ

Funções async são suportadas?

Sim. O tipo de retorno inferido é envolvido em Promise, então uma função async que retorna Todo[] é declarada como export declare function loadTodos(url: string): Promise<Todo[]>.

O que acontece com membros private?

Eles são mantidos só pelo nome, por exemplo "private items;", de modo que o formato da classe continua batendo sem expor o tipo.

Os valores padrão dos parâmetros são mantidos?

Não. Um parâmetro com valor padrão vira opcional, então constructor(public readonly currency = "USD") vira constructor(currency?: string).

Especificações e referências