考虑下面的代码段:
type asdf = '.' | number;
const foo: asdf[] = ['.', 1, 3, '.'];
const bar: number[] = foo.filter(v => typeof v === 'number');
编译失败,因为编译器无法推断出bar
的类型是number[]
。
答案 0 :(得分:2)
您需要使用type guard来实现此目标。
类型保护是一个函数,它接收项v
并声明它是类型Foo
。在您的示例中,您的键入后卫将如下所示:
function isNumber(value: asdf): value is number {
return typeof value === "number";
}
然后,您会将该值传递到filter
函数中,如下所示:
const bar: number[] = foo.filter(isNumber);
如果你想保持你的功能内联,你可以这样做(但我觉得它不太清楚):
const bar: number[] = foo.filter((item): item is number => typeof item === "number");
你的代码没有用,因为你没有item is number
部分 - 这告诉编译器如果断言(typeof item === "number"
)返回true,那么item
是输入number
。