TypeScript のメソッド宣言では、パラメーターは文字列、ブール値、または数値の配列型である可能性があります。any[] として宣言する必要がありますか、または入力タイプをこれら 3 つのタイプのいずれかに制限する方法はありますか?
5 に答える
Typescript 1.4でUnion 型が導入されたため、答えはyes になりました。
function myFunc(param: string[] | boolean[] | number[]): void;
指定されたもの以外の型を使用すると、コンパイル時エラーが発生します。
複数の特定の型の配列が必要な場合は、ユニオン型も使用できます。
function myFunc(param: (string|boolean|number)[]): void;
これは、OP が要求したものとは異なることに注意してください。この 2 つの例は、意味が異なります。
これは少し古い質問のようですが、とにかく、私はそれに出くわし、私が持ってきたこの他の答えを見逃しました.
TypeScript 1.4 から、次のように関数パラメーターに対して複数の可能な型を宣言できるようです。
class UtilsClass {
selectDom(element: string | HTMLElement):Array<HTMLElement> {
//Here will come the "magic-logic"
}
}
これは、TypeScript の「共用体型」という新しい概念によるものです。
詳細はこちらでご覧いただけます。
これを行うには、関数のオーバーロードを使用できます。
class Thing {
public foo(x: number[]);
public foo(x: bool[]);
public foo(x: string[]);
public foo(x: any[]) {
// Note: You'll have to do type checking on 'x' manually
// here if you want differing behavior based on type
}
}
// Later...
var t = new Thing();
t.foo(someArray); // Note: External callers will not see the any[] signature
これを解決する別の方法は、入力型間で共通のメソッドとプロパティを見つけ、これらの共通のメソッドとプロパティを保持するメソッド宣言でインライン型を宣言することです。このような:
methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
文字列、ブール値、数値はプリミティブ型なので、簡単な方法はないと思います。異なるオブジェクト タイプのセットを使用する場合は、スーパー クラスを考え出し、メソッドのインターフェイスでそのスーパー クラスを指定することができます。一方、メソッドのオーバーロードを使用して、文字列、ブール値、および整数の配列に異なる実装を指定することもできます。