web-dev-qa-db-ja.com

エラーTS2345:タイプ 'T'の引数は、タイプ 'object'のパラメーターに割り当てることができません

以下のコードは、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'のパラメーターに割り当てることができません。

8
Nenad

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;
}
11
Nenad

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は、objectTを拡張するようにコンパイラに通知されない限り、objectに割り当てることができません。

バージョン2.2より前は、コンパイラは次のようなエラーをキャッチしませんでした。

Object.create(1, {});

今、コンパイラは文句を言うでしょう:

タイプ '1'の引数は、タイプ 'object'のパラメーターに割り当てることができません。

6
Seamus