TypeScript中高阶函数使用类型谓词是否有可行解决方案?
TypeScript中是否有办法在高阶函数中使用类型谓词?
可以实现,不过需要调整高阶函数的参数接收顺序。
问题代码(存在错误)
你原本的写法会触发Cannot find parameter 'obj'.ts(1225)错误,代码如下:
type One = { _type: 'one'; value: unknown; }; type Two = { _type: 'two'; value: unknown; }; type Discriminated = One | Two; const is = <O extends Discriminated>(obj: O) => <K extends O['_type']>(key: K): obj is Extract<O, { _type: K }> => obj._type === key;
正确实现方案
通过先传入key、再返回接收obj的函数的方式,可以正确使用类型谓词:
const isReversed = <O extends Discriminated, K extends O['_type']>(key: K) => (obj: O): obj is Extract<O, { _type: K }> => obj._type === key;
原因说明
原写法中,内层泛型函数的返回类型注解无法正确捕获外层函数的obj参数上下文,导致TypeScript无法识别obj的存在。调整参数顺序后,泛型参数的作用域和参数上下文能够被正确解析,从而实现预期的类型收窄效果。
未来若有更优方案可更新。
内容的提问来源于stack exchange,提问作者Janek Eilts
相关产品推荐
相关产品推荐

