以下代码适用于TypeScript 2.1.6:
function create<T>(prototype: T, pojo: Object): T {
// ...
return Object.create(prototype, descriptors) as T;
}
更新到TypeScript 2.2.1后,我收到以下错误:
错误TS2345:类型&#39; T&#39;不能分配给参数 键入&#39; object&#39;。
答案 0 :(得分:8)
更改函数的签名,以便泛型类型T
扩展类型object
,在Typescript 2.2中引入。使用此语法 - <T extends object>
:
function create<T extends object>(prototype: T, pojo: Object): T {
...
return Object.create(prototype, descriptors) as T;
}
答案 1 :(得分:5)
TypeScript 2.2中更改了Object.create
的签名。
在TypeScript 2.2之前,Object.create
的类型定义是:
create(o: any, properties: PropertyDescriptorMap): any;
但正如您所指出的,TypeScript 2.2 introduced object
类型:
TypeScript没有表示非基本类型的类型,即任何不是
number
|的类型。string
|boolean
|symbol
|null
|undefined
。输入新的对象类型。使用对象类型,可以更好地表示Object.create等API。
Object.create
的类型定义更改为:
create(o: object, properties: PropertyDescriptorMap): any;
因此,除非编译器被告知T
扩展object
,否则示例中的泛型T
不能分配给object
。
在2.2版之前,编译器不会捕获这样的错误:
Object.create(1, {});
现在编译器会抱怨:
类型'1'的参数不能分配给'object'类型的参数。