El paso a paso o código que hallarás en este post es la solución más eficiente y efectiva que encontramos a esta duda o problema.
Solución:
Cambie la firma de la función, de modo que el tipo genérico T
extiende el tipo object
, introducido en Typescript 2.2. Utilice esta sintaxis –
:
function create(prototype: T, pojo: Object): T
...
return Object.create(prototype, descriptors) as T;
la firma para Object.create
se cambió en TypeScript 2.2.
Antes de TypeScript 2.2, la definición de tipo para Object.create
estaba:
create(o: any, properties: PropertyDescriptorMap): any;
Pero como usted señala, TypeScript 2.2 introdujo el object
escribe:
TypeScript no tenía un tipo que representara el tipo no primitivo, es decir, cualquier cosa que no sea
number
|string
|boolean
|symbol
|null
|undefined
. Introduzca el nuevo tipo de objeto.Con el tipo de objeto, las API como Object.create se pueden representar mejor.
La definición de tipo para Object.create
fue cambiado a:
create(o: object, properties: PropertyDescriptorMap): any;
Así que el tipo genérico T
en su ejemplo no es asignable a object
a menos que se le diga al compilador que T
extiende object
.
Antes de la versión 2.2, el compilador no detectaría un error como este:
Object.create(1, );
Ahora el compilador se quejará:
El argumento de tipo ‘1’ no se puede asignar al parámetro de tipo ‘objeto’.