代码之家  ›  专栏  ›  技术社区  ›  LudvigH

数组的最小类型批注。原型过滤和歧视联合?

  •  1
  • LudvigH  · 技术社区  · 7 年前

    请考虑以下代码段:

    type asdf = '.' | number;
    const foo: asdf[] = ['.', 1, 3, '.'];
    const bar: number[] = foo.filter(v => typeof v === 'number');
    

    由于编译器无法推断 bar number[] .

    1. 为什么编译器不能推断出正确的类型?
    2. 使编译器理解类型的最小类型注释是什么?
    1 回复  |  直到 7 年前
        1
  •  2
  •   James Monger    7 年前

    您需要使用 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 part-它告诉编译器如果( typeof item === "number" )返回true,然后 item 属于类型 number .

    推荐文章