我想使用类型保护和如下的附加信息。
type Something = string | number;
const isSomething = (anything: unknown): {
result: anything is Something,
additionalInfo: any
} => {
...
}
...
const afterTypeGuard = isSomething(thing);
if (afterTypeGuard.result === true) {
return {
afterTypeGuard.additionalInfo,
length: thing.length,
}
} else {
return (thing + 32) * 3;
}
...
但我无法将返回类型设置为result: anything is Something
而不是result: boolean
有没有办法做到这一点?
2条答案
按热度按时间dbf7pr2w1#
简短的答案是no, you can't enhance the return type of a custom type guard,尽管正如jcalz所指出的,有一个相关的feature request。
在previous answer中描述了几种方法-“单独提取
additionalInfo
”,或者“将additionalInfo
分配为类型保护的副作用”-但可能更接近于您所描述的是将原始值作为结果的一部分,使用缩小的类型。在一个简单的公式中,这可能是:Playground
通过一些额外的工作,
GuardResult
可以扩展为互补类型(即当result
为false时):Playground / Expanded playground
沿着类似的路线,但有一点类型滥用,你可以沿着函数式编程中的
Either
模式做一些事情-让你的guard-like函数返回一对大致表示“成功”和“失败”的对,例如,如果inputValue
是guarded类型,则返回[inputValue, undefined]
,否则返回[undefined, inputValue]
,在这两种情况下适当地缩小类型:这可能会有点混乱(参见this example快速而肮脏的实现),因为
undefined
的值泄漏了,但返回值确实以一种令人愉快的方式破坏了结构:trnvg8h32#
你有没有尝试在条件语句中使用类型别名?