过滤联合类型中的一种可能性

时间:2017-12-12 22:55:51

标签: typescript typechecking

以下内容无法编译:

function f(n: number): (number|null) {
  return n > 0 ? n : null;
}

function g(a: number[]): number[] {
  return a.map(f).filter(n => n);
}

问题是,编译器不理解filter()的语义,并没有意识到它将省略列表中的所有falsey条目。结果,它失败了" Type'(number | null)[]'不能指定为' number []'。"

以下工作正常:

function g(n: number[]): number[] {
  return n.map(f).filter(n => n).map(n => n!); 

}

但是经历了无意义的循环。这也有效

function g(a: number[]): number[] {
  return a.map(f).filter(n => n) as number[];
}

但像这样的演员会掩盖许多罪恶。还有其他建议吗?

1 个答案:

答案 0 :(得分:3)

您可以提取过滤方法并使用Type Guards使其更加精确。

像这样:

function f(n: number): (number | null) {
    return n > 0 ? n : null
}

function hasValue(n: number | null): n is number {
    return !!n
}

function g(a: number[]): number[] {
    return a.map(f).filter(hasValue)
}

请注意。 !! n也将过滤0,因此不严格正确但适合突出显示类型警卫