错误 TS2345:'T' 类型的参数不可分配给 'object' 类型的参数
error TS2345: Argument of type 'T' is not assignable to parameter of type 'object'
下面的代码在 TypeScript 2.1.6 中运行良好:
function create<T>(prototype: T, pojo: Object): T {
// ...
return Object.create(prototype, descriptors) as T;
}
更新到 TypeScript 2.2.1 后,出现以下错误:
error TS2345: Argument of type 'T' is not assignable to parameter of
type 'object'.
更改函数的签名,以便泛型类型 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;
}
Object.create
的签名在 TypeScript 2.2 中已更改。
在 TypeScript 2.2 之前,Object.create
的类型定义是:
create(o: any, properties: PropertyDescriptorMap): any;
但是正如您所指出的,TypeScript 2.2 introduced object
类型:
TypeScript did not have a type that represents the non-primitive type, i.e. any thing that is not number
| string
| boolean
| symbol
| null
| undefined
. Enter the new object type.
With object type, APIs like Object.create can be better represented.
Object.create
的类型定义已更改为:
create(o: object, properties: PropertyDescriptorMap): any;
因此您示例中的泛型类型 T
不可分配给 object
除非编译器被告知 T
扩展 object
.
在 2.2 版之前,编译器不会捕获这样的错误:
Object.create(1, {});
现在编译器会报错:
Argument of type '1' is not assignable to parameter of type 'object'.
下面的代码在 TypeScript 2.1.6 中运行良好:
function create<T>(prototype: T, pojo: Object): T {
// ...
return Object.create(prototype, descriptors) as T;
}
更新到 TypeScript 2.2.1 后,出现以下错误:
error TS2345: Argument of type 'T' is not assignable to parameter of type 'object'.
更改函数的签名,以便泛型类型 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;
}
Object.create
的签名在 TypeScript 2.2 中已更改。
在 TypeScript 2.2 之前,Object.create
的类型定义是:
create(o: any, properties: PropertyDescriptorMap): any;
但是正如您所指出的,TypeScript 2.2 introduced object
类型:
TypeScript did not have a type that represents the non-primitive type, i.e. any thing that is not
number
|string
|boolean
|symbol
|null
|undefined
. Enter the new object type.With object type, APIs like Object.create can be better represented.
Object.create
的类型定义已更改为:
create(o: object, properties: PropertyDescriptorMap): any;
因此您示例中的泛型类型 T
不可分配给 object
除非编译器被告知 T
扩展 object
.
在 2.2 版之前,编译器不会捕获这样的错误:
Object.create(1, {});
现在编译器会报错:
Argument of type '1' is not assignable to parameter of type 'object'.