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

Nen*_*nad 9 typescript typescript2.2

代码bellow与Typescript 2.1.6一起正常工作

function create<T>(prototype: T, pojo: Object): T {
    // ...
    return Object.create(prototype, descriptors) as T;
}
Run Code Online (Sandbox Code Playgroud)

更新到Typescript 2.2.1后,我收到以下错误:

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

Nen*_*nad 11

更改函数的签名,以便在Typescript 2.2中引入泛型类型T扩展类型object.使用此语法 - <T extends object>:

function create<T extends object>(prototype: T, pojo: Object): T {
    ...
    return Object.create(prototype, descriptors) as T;
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*mus 6

的签名Object.create已在TypeScript 2.2中更改。

在TypeScript 2.2之前,其类型定义为Object.create

create(o: any, properties: PropertyDescriptorMap): any;
Run Code Online (Sandbox Code Playgroud)

但正如您指出的那样,TypeScript 2.2引入了该object类型:

TypeScript没有代表非基本类型的类型,即不是number| string| boolean| symbol| null| undefined。输入新的对象类型。

使用对象类型,可以更好地表示Object.create之类的API。

的类型定义Object.create已更改为:

create(o: object, properties: PropertyDescriptorMap): any;
Run Code Online (Sandbox Code Playgroud)

因此Tobject除非告知编译器T扩展,否则示例中的泛型类型不能分配给该类型object

在2.2版之前,编译器不会捕获如下错误:

Object.create(1, {});
Run Code Online (Sandbox Code Playgroud)

现在编译器会抱怨:

类型“ 1”的参数不能分配给类型“对象”的参数。