如何使用过滤器缩小类型?我很惊讶地在下面的代码中看到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 => ...)
还有一个相关的问题:将ResultOutcome
和ErrorOutcome
定义为类并使用instanceof
运算符会更符合Typescript的思想吗?
答案 0 :(得分:3)
如果您直接向error
提供ErrorOutcome
,TypeScript会发现isErrorOutcome
是filter
:
results.filter(isErrorOutcome).forEach(error => ...)
很显然,is ErrorOutcome
方面无法在箭头函数包装器中幸免。您可以将其添加回去:
results.filter((result): result is ErrorOutcome => isErrorOutcome(result)).forEach(error => ...);