Typescript Array.prototype.filter和判别联合的最小类型批注?
考虑下面的代码片段:Typescript Array.prototype.filter和判别联合的最小类型批注?,typescript,filter,functional-programming,Typescript,Filter,Functional Programming,考虑下面的代码片段: type asdf = '.' | number; const foo: asdf[] = ['.', 1, 3, '.']; const bar: number[] = foo.filter(v => typeof v === 'number'); 编译失败,因为编译器无法推断bar的类型是number[] 为什么编译器不能推断出正确的类型 使编译器理解类型的最小类型注释是什么 要实现这一点,您需要使用 类型保护是一个函数,它接收一个项目v,并断言它是类型Foo。
type asdf = '.' | number;
const foo: asdf[] = ['.', 1, 3, '.'];
const bar: number[] = foo.filter(v => typeof v === 'number');
编译失败,因为编译器无法推断bar
的类型是number[]
v
,并断言它是类型Foo
。在您的示例中,您的类型保护将如下所示:
function isNumber(value: asdf): value is number {
return typeof value === "number";
}
然后将该值传递到过滤器函数中,如下所示:
const bar: number[] = foo.filter(isNumber);
如果你想让你的函数保持内联,你可以这样做(但我觉得有点不太清楚):
您的代码无法工作,因为您没有项是数字
部分-这告诉编译器,如果断言(typeof item===“number”
)返回true,那么项
的类型就是number,内联版本正是我所希望的解决方案。非常感谢!
const bar: number[] = foo.filter((item): item is number => typeof item === "number");