TypeScriptでは、引数の型によってメソッドのシグネチャを変えるオーバーロード機能があります。ただし、TypeScriptはJavaScriptにコンパイルするものである都合上、実装は1つしか作れないので、内部で値を見て分岐する必要があります。
ただ、ものによっては、型の違いがジェネリクスの違いだけになってしまうので、内部で仕分けることができない場合があります。
typescript
1// lib.es5.d.tsより 2 3interface ReadonlyArray<T> { 4 // 中略 5 filter<S extends T>(callbackfn: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): S[]; 6 filter(callbackfn: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): T[]; 7 // 後略 8}
ご存知のArray.prototype.filter
ですが、このようにコールバックがvalue is S
の関数の場合については型を切り替える、というようになっています。
ただ、このようなinterface
を宣言した上で実際にfilter(callbackfn)
を定義しようとすると、'callbackfn' implicitly has an 'any' type
となるなど、型エラーだらけになってしまいますし、Java同様ジェネリクスはコンパイル時に消えてしまうので、動的に分岐させることも叶いません。
とりあえず「内部は厳密に型を定めず、any
やas
を使って型エラーを抑制する」ようにすれば書くことはできますが、このような「ジェネリクスだけ違うメソッドのオーバーロード」をやる場合には、実装時に型を無視する以外に方法はないのでしょうか。
補足情報(FW/ツールのバージョンなど)
TypeScript 3.7.5(質問時点での最新)
あなたの回答
tips
プレビュー