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");