以下のコードは、TypeScript 2.1.6で正常に機能していました。
function create<T>(prototype: T, pojo: Object): T {
// ...
return Object.create(prototype, descriptors) as T;
}
TypeScript 2.2.1に更新した後、次のエラーが表示されます。
エラーTS2345:タイプ 'T'の引数は、タイプ 'object'のパラメーターに割り当てることができません。
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;
}
Object.create
の署名は、TypeScript 2.2で変更されました。
TypeScript 2.2より前では、Object.create
の型定義は次のとおりでした。
create(o: any, properties: PropertyDescriptorMap): any;
しかし、あなたが指摘するように、 TypeScript 2.2が導入されました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'のパラメーターに割り当てることができません。