我有一个关于过滤器在 TS 中如何工作的问题:
我有一个 Foo
type Foo = {
foo: number[];
bar: number[];
lol: string;
};
const obj: Foo = {
foo: [1,2,3],bar: [4,5],lol: "lol"
};
我需要过滤掉非数组值并提取数字
const re = Object.values(obj)
.filter((val) => Array.isArray(val))
.flatMap((num) => num);
console.log(re); //[1,3,4,5]
现场演示如下:https://codesandbox.io/s/hopeful-mclaren-x59u8?file=/src/index.ts
但是 TS 认为 .filter((val) => Array.isArray(val))
num
之后仍然可以是字符串,即它可以是 lol
。它似乎不知道 .filter
是如何工作的。
即使没有 flatMap
,如果我们检查 re
的类型,你会得到 const re: (string | number[])[]
意味着 re
仍然可能是一个字符串,这在这里不是真的,因为我们根据 Array.isArray
过滤掉它。