TypeScript ジェネリクスエラー解決
TypeScriptのエラーTS2322を解決する方法: "could be instantiated with a different subtype of constraint 'object'"
エラーメッセージの意味
このエラーは、TypeScriptのジェネリック型に関するものです。ジェネリック型は、さまざまなデータ型を受け入れることができる型であり、型安全性を維持するために制約が設定されます。このエラーは、ジェネリック型のインスタンスが、その制約よりもより具体的な型でインスタンス化できる可能性があることを示しています。
解決方法
-
制約を明確にする
- ジェネリック型の制約が十分に厳しくない場合、エラーが発生する可能性があります。制約をより具体的に定義することで、エラーを解決できます。
- 例えば、
object
という制約を、より具体的なインターフェースや型に置き換えることができます。
-
型推論の活用
-
条件付き型を使用する
具体的な例
// エラーが発生するコード
interface Animal {
name: string;
}
interface Dog extends Animal {
bark(): void;
}
function getAnimal<T extends object>(animal: T): T {
return animal;
}
const dog: Dog = { name: 'ポチ', bark: () => {} };
const animal = getAnimal(dog); // エラー: TS2322
// 解決方法1: 制約を明確にする
function getAnimal<T extends Animal>(animal: T): T {
return animal;
}
// 解決方法2: 型推論を活用
function getAnimal<T>(animal: T): T {
return animal;
}
// 解決方法3: 条件付き型を使用
type AnimalOrDog<T> = T extends Dog ? Dog : Animal;
function getAnimal<T>(animal: T): AnimalOrDog<T> {
return animal;
}
TypeScriptのエラーTS2322を解決するコード例
インターフェースの継承を利用する:
typescript typescript-generics