Vai al contenuto

Da Flow a dichiarazioni TypeScript — Numio

Converte il codice Flow in TypeScript con flow-to-ts, quindi emette solo un file di dichiarazione .d.ts con il compilatore TypeScript. I corpi vengono rimossi e i parametri con valori predefiniti diventano facoltativi.

Un pacchetto è scritto in Flow e desideri spedire tipi TypeScript per i consumatori TypeScript senza migrare l'origine.

Flow

TypeScript Declarations

Quando usarlo

  • Un pacchetto è scritto in Flow e desideri spedire tipi TypeScript per i consumatori TypeScript senza migrare l'origine.
  • Si desidera confrontare lo API esportato di un modulo di flusso con il suo equivalente TypeScript.

Come si usa

  1. Incolla un modulo Flow nel pannello Flow.
  2. Un Web Worker locale converte il codice in TypeScript con declarationOnly attivo e genera le dichiarazioni.
  3. Copia il risultato dal pannello Dichiarazioni TypeScript in un file index.d.ts accanto al punto di ingresso del pacchetto.

Flusso

// @flow
export type Point = { x: number, y: number };
export type Shape = 'circle' | 'square';
export type Label = ?string;
export const ORIGIN: Point = { x: 0, y: 0 };

export function distance(a: Point, b: Point = ORIGIN): number {
  return Math.hypot(a.x - b.x, a.y - b.y);
}

export class Canvas {
  shapes: Shape[] = [];
  draw(shape: Shape, at?: Point): void { this.shapes.push(shape); }
}

Dichiarazioni TypeScript (.d.ts)

export type Point = {
  x: number
  y: number
}
export type Shape = "circle" | "square"
export type Label = string | null | undefined
export declare const ORIGIN: Point
export declare function distance(a: Point, b?: Point): number
export declare class Canvas {
  shapes: Shape[]
  draw(shape: Shape, at?: Point): void
}

Dettagli e limiti

La conversione avviene localmente in un Web Worker del browser; l’input non viene caricato su un server. Al primo utilizzo il browser scarica il modulo di conversione necessario.

Vengono caricate le librerie ES2020 e DOM di TypeScript, quindi Array<T>, Promise, Date e $ReadOnlyArray (convertito in ReadonlyArray) compaiono nelle dichiarazioni così come sono scritti.

I tipi maybe diventano T | null | undefined, come Label nell’esempio.

Viene compilato un solo file; i tipi importati non vengono risolti.

FAQ

Le funzioni asincrone e i tipi di restituzione Promise vengono mantenuti?

Sì. export async function load(id: number): Promise<Tag> diventa export declare function load(id: number): Promise<Tag>.

Cosa succede ai valori dei parametri predefiniti?

I valori predefiniti vengono rimossi e il parametro diventa facoltativo: b: Point = ORIGIN diventa b?: Point.

Vengono mantenuti gli alias dei tipi?

Sì. Gli alias del tipo esportato vengono visualizzati nel formato TypeScript convertito. La pagina formatta il risultato con Prettier, quindi utilizza il rientro a due spazi e nessun punto e virgola.

Specifiche e riferimenti