何をしたかった?
ジェネリクスを伴うインターフェイスを具象クラスでimplemetsする際に、「型の制約に幅をもたせたい!」というケースに遭遇しました。
しかし、「ジェネリクス インターフェイス Typescript」のように検索しても、implememtsする際に型を唯一に制約するような例しか出てきませんでした。
例えば以下のようなものです。
ジェネリクスの入門記事でよく見かけるような内容かと思います。
interface IHoge<T extends number | string | boolean> {
hoge(item: T): T;
}
class Hoge implements IHoge<number> {
hoge(item: number): number {
return item;
}
}
自分が実現したいのは「number
と string
を取り扱える具象クラスを実装したい!」というものでしたが、上例のように実装してしまうと、クラスHoge
は number
型しか取り扱えなくなります。
どうやって解決した?
以下のように、インターフェイスIHoge
に T
を渡し、具象クラスHoge
において T extends ○ | △
で制約をかけることで実現できました。
interface IHoge<T extends number | string | boolean> {
hoge(item: T): T;
}
class Hoge<T extends number | string> implements IHoge<T> {
hoge(item: T): T {
return item;
}
}