Aller au contenu

Générer des déclarations TypeScript — Numio

Émet un fichier de déclarations .d.ts à partir de code TypeScript, comme tsc --declaration --emitDeclarationOnly. Les corps de fonction et les initialiseurs sont supprimés, et les membres private des classes ne gardent que leur nom.

Vous voulez prévisualiser la surface de types publique qu’un fichier de bibliothèque publiera avant de builder le paquet.

TypeScript

TypeScript

Quand l’utiliser

  • Vous voulez prévisualiser la surface de types publique qu’un fichier de bibliothèque publiera avant de builder le paquet.
  • Vous avez besoin d’un .d.ts maintenu à la main pour un seul module, ou d’une entrée ne contenant que des déclarations pour l’outil TypeScript to Flow.

Mode d’emploi

  1. Collez un module TypeScript dans le panneau TypeScript.
  2. Le code est envoyé à /api/flow-to-typescript avec isTS et declarationOnly activés, et le compilateur TypeScript émet les déclarations sur le serveur.
  3. Copiez les déclarations dans un fichier .d.ts. La page les formate avec Prettier : indentation de deux espaces et pas de points-virgules.

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

Déclarations 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
}

Détails et limites

La page envoie votre saisie à une route serveur (/api/flow-to-typescript) pour la conversion ; elle n’est pas traitée uniquement dans le navigateur. Par défaut, les routes API de Next.js acceptent des corps de requête jusqu’à 1 Mo.

Le compilateur charge les fichiers de bibliothèque ES2020 et DOM de TypeScript, si bien que Promise, Date, Map et les types de retour inférés depuis des méthodes natives (number pour subtotal dans l’exemple) sont écrits correctement.

Les erreurs de syntaxe interrompent la conversion, et le message du compilateur, par exemple TS1134 "Variable declaration expected", s’affiche à la place de la sortie.

Chaque entrée est compilée comme un seul fichier ; les imports d’autres modules ne sont pas résolus.

FAQ

Les fonctions async sont-elles prises en charge ?

Oui. Le type de retour inféré est enveloppé dans Promise, donc une fonction async qui renvoie Todo[] est déclarée comme export declare function loadTodos(url: string): Promise<Todo[]>.

Que deviennent les membres private ?

Ils ne sont conservés que par leur nom, par exemple "private items;", si bien que la forme de la classe correspond toujours sans exposer le type.

Les valeurs par défaut des paramètres sont-elles conservées ?

Non. Un paramètre avec une valeur par défaut devient optionnel : constructor(public readonly currency = "USD") devient constructor(currency?: string).

Spécifications et références