Array.prototype.filter和区分联合的最小类型注释?

时间:2017-12-27 15:12:09

标签: typescript filter functional-programming

考虑下面的代码段:

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

编译失败,因为编译器无法推断出bar的类型是number[]

  1. 为什么编译器不能推断出正确的类型?
  2. 什么是使编译器理解类型的最小类型注释?

1 个答案:

答案 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