Menu

Alias de type en TypeScript : le mot-clé type avec exemples

Un alias de type donne un nom à n'importe quel type grâce au mot-clé type : formes d'objets, unions, tuples, fonctions, génériques et types récursifs. Découvrez la syntaxe, à quoi ressemble chaque forme, et pourquoi un alias n'est qu'un nom et pas un nouveau type distinct.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Un alias de type donne un nom à un type. Vous écrivez type Name = ..., et à partir de là Name peut être utilisé partout où un type est attendu. Contrairement à une interface, un alias peut nommer absolument n'importe quel type, pas seulement des formes d'objets.

Les alias n'existent qu'à la compilation. Le JavaScript émis ne contient aucune de ces lignes type.

Syntaxe

type Name = SomeType;
type Name<T> = SomeTypeUsing<T>;       // generic
export type Name = SomeType;           // exported from a module

Par convention, les noms sont en PascalCase. Le côté droit est n'importe quelle expression de type, et un alias peut utiliser d'autres alias, y compris lui-même (voir les types récursifs plus bas). L'alias est disponible dans toute la portée où il est déclaré, même au-dessus de la ligne de déclaration, car les types sont vérifiés à la compilation et ne s'exécutent pas dans l'ordre comme const ou let.

Types objet

Pour une forme d'objet, un alias et une interface s'écrivent presque de la même façon. L'alias utilise = et se termine en général par un point-virgule.

Un alias ne peut pas utiliser extends ; c'est l'intersection & qui joue ce rôle. La vérification des propriétés en trop, les propriétés optionnelles et readonly fonctionnent exactement comme pour les interfaces. Le choix entre les deux pour les formes d'objets est traité sur la page interface ou type.

Unions, tuples et fonctions

Ce sont les cas que seul un alias peut nommer, et la principale raison d'être de type. Un alias d'union liste les alternatives, un alias de tuple fixe la longueur et le type des éléments d'un tableau, et un alias de fonction décrit une signature.

Dans scale, les paramètres n'ont pas besoin d'annotations : l'alias Transform fournit leurs types. La syntaxe des tuples est présentée dans tuples, et le narrowing des unions sur la page des types union.

Alias de type génériques

Les paramètres de type permettent à un seul alias de servir pour de nombreux types. Ils peuvent avoir des valeurs par défaut, comme les paramètres de fonction.

Result<number> utilise la valeur par défaut E = string. De petits alias génériques comme type Nullable<T> = T | null ou type Dict<T> = Record<string, T> sont courants dans du vrai code. Les types utilitaires intégrés (Partial<T>, Pick<T, K>, ReturnType<F>) sont eux aussi des alias génériques, déclarés dans la bibliothèque standard.

Les alias sont des noms, pas de nouveaux types

Un alias ne crée pas de type distinct. C'est un second nom pour le type de droite, et le compilateur traite les deux comme identiques. Deux alias de string sont entièrement interchangeables :

Ce code affiche cancelling u_42 sans erreur, et c'est précisément le bug qu'un alias ne peut pas empêcher. L'alias aide quand même les lecteurs (un paramètre typé OrderId en dit plus que string), mais si confondre deux identifiants doit être une erreur de compilation, utilisez un type branded comme string & { readonly __brand: "OrderId" }.

Alias de type récursifs

Un alias peut faire référence à lui-même, c'est ainsi qu'on décrit des arbres, des listes imbriquées et du JSON :

L'alias Json refuse les valeurs que JSON ne peut pas représenter : { when: new Date() } ou { f: undefined } assignés à Json sont des erreurs de compilation (TS2322).

Des types à partir de valeurs : typeof

Quand une valeur existe déjà, vous pouvez nommer son type au lieu de l'écrire. L'opérateur de type typeof lit le type d'une variable, et il se combine avec d'autres opérateurs :

const defaults = { retries: 3, verbose: false, level: "info" };

type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }

type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"

function start(port: number) {
  return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }

La valeur reste l'unique source de vérité : ajoutez une propriété à defaults et Options suit. Plus de détails dans typeof.

Exporter et importer des alias

Les alias s'exportent et s'importent comme des valeurs. import type indique explicitement que seul un type est importé, si bien que l'import est toujours retiré de la sortie JavaScript :

// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };

// main.ts
import type { Point, Shape } from "./shapes.js";

const p: Point = { x: 1, y: 2 };

Questions fréquentes

Qu'est-ce qu'un alias de type en TypeScript ?

Un alias de type est un nom pour un type, déclaré avec le mot-clé type : type Point = { x: number; y: number }. Ensuite, Point peut être utilisé partout où un type est attendu. Il peut nommer n'importe quel type : une forme d'objet, une union, un tuple, une signature de fonction, une primitive ou un type générique.

Un alias de type crée-t-il un nouveau type ?

Non. Un alias n'est qu'un autre nom pour un type existant. Avec type UserId = string et type OrderId = string, un UserId peut être passé là où un OrderId est attendu, car les deux ne sont que string. Pour créer des types non interchangeables, utilisez un type branded.

Un alias de type peut-il faire référence à lui-même ?

Oui, tant que l'autoréférence est imbriquée dans un type objet, un tableau ou un tuple : type TreeNode = { value: number; children: TreeNode[] } et un alias Json qui inclut Json[] fonctionnent tous les deux. Une référence nue comme type Loop = Loop | string provoque l'erreur TS2456, Type alias 'Loop' circularly references itself.

Un alias de type peut-il être générique ?

Oui. Placez les paramètres de type après le nom : type Box<T> = { value: T }, puis utilisez-le sous la forme Box<number>. Les paramètres peuvent avoir des valeurs par défaut (type Result<T, E = string> = ...) et des contraintes (type Keys<T extends object> = keyof T).

Comment obtenir un type à partir d'un objet existant ?

Utilisez l'opérateur de type typeof : const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; donne { retries: number; verbose: boolean }. Cela garde une seule source de vérité quand la valeur vient en premier.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER