Un type objet TypeScript liste les propriétés d'un objet et le type de chacune : { name: string; age: number }. Ajoutez ? pour rendre une propriété optionnelle et readonly pour empêcher sa réassignation. Écrivez le type en ligne, ou nommez-le avec type ou interface pour le réutiliser.
Écrire des types objet
Les propriétés sont séparées par ; ou , (les deux fonctionnent, ; est le style habituel), et un retour à la ligne suffit à lui seul. Un type en ligne convient pour un paramètre ponctuel ; pour tout ce qui sert deux fois, donnez-lui un nom.
// Inline, in a parameter
function area(rect: { width: number; height: number }): number {
return rect.width * rect.height;
}
// Named with a type alias
type Rect = { width: number; height: number };
// Named with an interface (the same shape)
interface RectShape {
width: number;
height: number;
}
type et interface décrivent aussi bien l'un que l'autre les formes d'objets. Leurs différences (fusion de déclarations, unions) sont présentées sur la page interface ou type.
Accéder à une propriété que le type ne déclare pas est une erreur de compilation : point.z donne TS2339, Property 'z' does not exist on type '{ x: number; y: number; }'.
Propriétés optionnelles
Un ? après le nom permet d'omettre la propriété. Lire une propriété optionnelle donne T | undefined, TypeScript vous oblige donc à traiter le cas où elle manque avant de l'utiliser.
Appeler une méthode sur une propriété optionnelle sans vérification est une erreur : p.nickname.toUpperCase() échoue avec TS18048, 'p.nickname' is possibly 'undefined'. Utilisez le chaînage optionnel (p.nickname?.toUpperCase()) quand undefined est un résultat acceptable.
prop?: T et prop: T | undefined ne sont pas équivalents. Le premier autorise l'absence de la clé ; le second exige la clé, même si sa valeur peut être undefined :
Propriétés readonly
readonly empêche la réassignation d'une propriété après la création de l'objet. C'est une vérification à la compilation uniquement, et elle est superficielle : un objet ou un tableau stocké dans une propriété readonly peut toujours être modifié de l'intérieur.
La sortie montre les deux limites : l'id a réellement changé à l'exécution (seul le compilateur savait qu'il était readonly), et le tableau intérieur a été modifié. Pour un tableau readonly, utilisez readonly string[] ; pour rendre toutes les propriétés readonly d'un coup, utilisez Readonly<Order>.
Vérification des propriétés en trop
Quand vous assignez un littéral objet directement à une variable typée ou le passez tel quel à un paramètre typé, TypeScript refuse toute propriété que le type ne déclare pas. Les propriétés supplémentaires dans un littéral frais sont presque toujours des fautes de frappe.
index.ts(8,8): error TS2561: Object literal may only specify known properties, but 'colour' does not exist in type 'Options'. Did you mean to write 'color'?
Le code est TS2561 parce que le compilateur a trouvé une correspondance proche ; une propriété en trop sans nom similaire donne TS2353, Object literal may only specify known properties, and 'z' does not exist in type 'Point'. Sans cette vérification, la faute de frappe compilerait, color vaudrait undefined, et le programme dessinerait en noir sans rien dire. La vérification ne s'applique qu'aux littéraux frais. Un objet qui se trouve déjà dans une variable peut porter des propriétés supplémentaires, car le typage de TypeScript est structurel : une valeur correspond à un type dès qu'elle possède au moins les propriétés requises.
Objets imbriqués et méthodes
Les types objet s'imbriquent, et ils peuvent décrire des méthodes soit avec la syntaxe de méthode, soit avec une propriété de type fonction.
Pour les formes profondes ou réutilisées, nommez le type intérieur (type Address = { ... }) et référencez-le, ou extrayez-le du type extérieur avec un accès indexé, Company["address"], comme le font les dernières lignes.
object, {} ou Object
Trois types se ressemblent et signifient des choses différentes :
| Type | Accepte | Refuse |
|---|---|---|
object | toute valeur non primitive : {}, [], fonctions, instances de classes | 5, "a", true, null, undefined |
{} | toute valeur sauf null et undefined, primitives comprises | null, undefined |
Object | la même chose que {}, avec en plus une vérification que les membres intégrés comme toString gardent des types compatibles | null, undefined |
{ x: number } | toute valeur possédant un x numérique | les valeurs sans x |
{} ne signifie pas « un objet vide » ; il signifie « ni null ni undefined ». Pour accepter n'importe quel objet aux clés inconnues, utilisez Record<string, unknown> ; pour une table de clés et de valeurs, utilisez une signature d'index ou Record comme le montre la page dictionnaire. La plupart du temps, une forme précise vaut mieux que l'un de ces trois types.
Questions fréquentes
Comment définir un type objet en TypeScript ?
Listez les propriétés et leurs types entre accolades : { name: string; age: number }. Vous pouvez l'écrire directement dans une annotation, ou lui donner un nom avec type User = { ... } ou interface User { ... } et le réutiliser. Séparez les propriétés par ; ou ,.
Comment rendre une propriété optionnelle en TypeScript ?
Placez ? après le nom de la propriété : { name: string; nickname?: string }. L'objet peut omettre nickname, et le lire donne string | undefined : vous devez donc le vérifier ou fournir une valeur par défaut (user.nickname ?? user.name) avant de l'utiliser comme une chaîne.
Quelle est la différence entre prop?: string et prop: string | undefined ?
prop?: string et prop: string | undefined ?Avec prop?: string, la clé peut être totalement absente. Avec prop: string | undefined, la clé est obligatoire, même si sa valeur peut être undefined, donc {} est une erreur de compilation. Lire l'une ou l'autre donne string | undefined.
Quelle est la différence entre object, {} et Object en TypeScript ?
object désigne n'importe quelle valeur non primitive (objets, tableaux, fonctions) et refuse 5 ou "a". {} désigne n'importe quelle valeur sauf null et undefined, primitives comprises. Object est presque identique à {} mais vérifie aussi que les méthodes intégrées comme toString gardent des types compatibles. Utilisez object, ou mieux une forme précise, plutôt que {} ou Object.
Pourquoi TypeScript affirme-t-il qu'un littéral objet ne peut spécifier que des propriétés connues ?
C'est la vérification des propriétés en trop : erreur TS2353, ou TS2561 quand le compilateur peut suggérer la propriété que vous vouliez sans doute écrire. Quand vous assignez un littéral objet frais directement à une variable ou à un paramètre typé, toute propriété que le type ne déclare pas est signalée, car c'est en général une faute de frappe. Assigner un objet stocké dans une autre variable échappe à cette vérification, puisque le typage structurel autorise les propriétés supplémentaires.