如何使用过滤器缩小类型?

时间:2020-07-06 14:25:25

标签: typescript

如何使用过滤器缩小类型?我很惊讶地在下面的代码中看到error的类型为Outcome,而不是ErrorOutcome

type Outcome = ResultOutcome | ErrorOutcome;
type ResultOutcome = {
  id: string;
  result: string;
};
type ErrorOutcome = {
  id: string;
  error: string;
};

function isErrorOutcome(val: Outcome): val is ErrorOutcome {
  return (val as ErrorOutcome).error !== undefined
}

function isResultOutcome(val: Outcome): val is ResultOutcome {
  return (val as ResultOutcome).result !== undefined
}

results.filter(result => isErrorOutcome(result)).forEach(error => ...)

还有一个相关的问题:将ResultOutcomeErrorOutcome定义为类并使用instanceof运算符会更符合Typescript的思想吗?

1 个答案:

答案 0 :(得分:3)

如果您直接向error提供ErrorOutcome,TypeScript会发现isErrorOutcomefilter

results.filter(isErrorOutcome).forEach(error => ...)

Playground link

很显然,is ErrorOutcome方面无法在箭头函数包装器中幸免。您可以将其添加回去:

results.filter((result): result is ErrorOutcome => isErrorOutcome(result)).forEach(error => ...);

Playground link