私は次の定義を持っています:
function foo(arg: number[] | number) {
if (Array.isArray(arg)) {
return [1]
}
return 0
}
typescriptが戻り値の型が何であるかを自動的に理解することを期待します。型ガードがあるため、isArray()
argが配列であるかどうかがわかり、戻り値の型をとして表示できnumber[]
ます。ただし、を使用すると、配列を渡す場合でもfoo(...)
戻り値が表示されnumber[] | 0
ます。
foo([]).push() // error because push doesnt exist on type 0
これは設計上の制限、バグ、まだ実装されていない問題、またはその他の問題ですか?
設計上の制限だと断定的に言うことはできませんが、jcalzやTitian Cernicova-Dragomirのような専門家が、型推論が制限されているさまざまな場所を、私たちが望むことを実行できなかったためではなく、それを行うにはコストがかかりすぎます(ランタイムコストまたはコンパイラのコードの複雑さの観点から)。これはそのカテゴリーに当てはまると思います。
あなたはおそらくこれを知っていますが、あなたの特定の例では、オーバーロードを使用してあなたが望む結果を得ることができます:
function foo(arg: number[]): number[];
function foo(arg: number): number;
function foo(arg: number[] | number) {
if (Array.isArray(arg)) {
return arg.map(v => v * 2);
}
return arg * 2;
}
foo([]).push(10);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加