错误TS2345:类型' T'的参数不能分配给'对象'

时间:2017-02-23 16:40:31

标签: typescript typescript2.2

以下代码适用于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;。

2 个答案:

答案 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'类型的参数。