web-dev-qa-db-fra.com

erreur TS2345: l'argument de type «T» n'est pas attribuable au paramètre de type «objet»

Le code ci-dessous fonctionnait bien avec TypeScript 2.1.6:

function create<T>(prototype: T, pojo: Object): T {
    // ...
    return Object.create(prototype, descriptors) as T;
}

Après la mise à jour vers TypeScript 2.2.1, j'obtiens l'erreur suivante:

erreur TS2345: l'argument de type "T" n'est pas attribuable au paramètre de type "objet".

8
Nenad

Modifiez la signature de la fonction afin que le type générique T étende le type object, introduit dans TypeScript 2.2. Utilisez cette syntaxe - <T extends object>:

function create<T extends object>(prototype: T, pojo: Object): T {
    ...
    return Object.create(prototype, descriptors) as T;
}
11
Nenad

La signature de Object.create A été modifiée dans TypeScript 2.2.

Avant TypeScript 2.2, la définition de type pour Object.create Était:

create(o: any, properties: PropertyDescriptorMap): any;

Mais comme vous le signalez, TypeScript 2.2 introduit le type object:

TypeScript n'avait pas de type qui représente le type non primitif, c'est-à-dire tout ce qui n'est pas number | string | boolean | symbol | null | undefined. Saisissez le nouveau type d'objet.

Avec le type d'objet, les API comme Object.create peuvent être mieux représentées.

La définition de type pour Object.create A été remplacée par:

create(o: object, properties: PropertyDescriptorMap): any;

Par conséquent, le type générique T dans votre exemple n'est pas attribuable à object sauf si le compilateur est informé que T étend object.

Avant la version 2.2, le compilateur ne détectait pas une erreur comme celle-ci:

Object.create(1, {});

Maintenant, le compilateur se plaindra:

L'argument de type "1" n'est pas attribuable au paramètre de type "objet".

6
Seamus