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