TypeScript、--strictNullChecks
モード。
null 許容文字列の配列があるとします。結果が 型になるように、すべての null を削除する単一式の(string | null)[]
方法は何でしょうか?string[]
const array: (string | null)[] = ["foo", "bar", null, "zoo", null];
const filterdArray: string[] = ???;
Array.filter はここでは機能しません:
// Type '(string | null)[]' is not assignable to type 'string[]'
array.filter(x => x != null);
配列の内包表記は機能する可能性がありますが、TypeScript ではサポートされていません。
実際、この問題は、ユニオンから特定の型を持つエントリを削除することによって、任意のユニオン型の配列をフィルタリングする問題に一般化できます。ただし、最も一般的な使用例である null およびおそらく undefined を含むユニオンに焦点を当てましょう。
ベストアンサー1
あなたは型述語.filter
厳密な型チェックを省略しないようにするには、関数を使用します。
function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
return value !== null && value !== undefined;
}
const array: (string | null)[] = ['foo', 'bar', null, 'zoo', null];
const filteredArray: string[] = array.filter(notEmpty);
タイプスクリプト 5.5 以上述語型を推論する方法を知っているなので、次のように書くだけで済みます:
const filteredArray: string[] = array.filter(x => x !== null)
代わりに、 を使用することもできますarray.reduce<string[]>(...)
。
厳密な述語
上記の解決策は、述語型が自動的に推論される場合など、ほとんどのシナリオで機能しますが、述語でより厳密な型チェックを行うこともできます。示されているように、関数はnotEmpty
実際にはコンパイル時に値が か かを正しく識別することを保証しませんnull
。undefined
たとえば、 return ステートメントを に短縮してみてください。関数がに対してreturn value !== null;
誤って を返しても、コンパイラ エラーは表示されません。true
undefined
これを軽減する方法の 1 つは、最初に制御フロー ブロックを使用して型を制約し、次にダミー変数を使用してコンパイラにチェックさせるものです。以下の例では、コンパイラは割り当てに到達するまでに、パラメータがorvalue
ではないことを推測できます。ただし、 if 条件から を削除すると、上記の例のバグを通知するコンパイラ エラーが表示されます。null
undefined
|| value === undefined
function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
if (value === null || value === undefined) return false;
const testDummy: TValue = value;
return true;
}
注意:この方法では失敗する状況も存在します。関連する問題に注意してください。反変性。