TypeScript, - strictNullChecks模式 .
假设我有一个可以为空的字符串数组(字符串| null)[] . 什么是 single-expression 方法以一种结果具有类型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和未定义的联合,因为这些是最常见的用例 .
4 回答
您可以在
.filter
中使用type predicate函数以避免选择退出严格类型检查:或者,您可以使用
array.reduce<string[]>(...)
.与@ bijou-trouvaille的答案类似,您只需将
<arg> is <Type>
声明为过滤函数的输出:您可以将
filter
结果转换为所需的类型:这适用于您提到的更一般的用例,例如:
(code in playground)
我相信你一切都很好,除了类型检查只是使过滤类型与返回类型不同 .