TypeScript 如何在链式嵌套函数中透传窄化类型?
报错原因
你当前的写法里,foo 函数的参数 f 类型被固定为联合类型 Key,没有捕获调用时传入的具体键的字面量类型。此时 SubKey<typeof f> 等价于 SubKey<Key>,也就是 keyof typeof Keys['KeyOne'] & keyof typeof Keys['KeyTwo'],由于两组子键没有交集,最终推导结果为 never,所以传入任何字符串都会触发类型报错。
解决方案
给外层函数 foo 增加泛型参数,绑定调用时传入的具体键类型,透传给内层函数的参数类型即可,修改后的完整代码如下:
const Keys = <const> { 'KeyOne': { 'SubKey1': '...', 'SubKey2': '...' }, 'KeyTwo': { 'SubKey3': '...', 'SubKey4': '...' } } type Key = keyof typeof Keys; type SubKey<K extends Key> = keyof typeof Keys[K]; // 给foo增加泛型参数K,捕获传入的具体键类型 function foo<K extends Key>(f: K){ return function bar(b: SubKey<K>){ //...业务逻辑 } } // 类型正常推断,不会报错 foo('KeyOne')('SubKey1') // 传入不匹配的子键会正确触发类型校验:foo('KeyOne')('SubKey3')
这种写法下,TS会自动根据第一次调用foo传入的键值,推导泛型K的具体类型,进而约束第二层函数的入参只能是对应键下的合法子键,完全符合嵌套类型透传的需求。
内容的提问来源于stack exchange,提问作者JHAvrick
相关产品推荐
相关产品推荐

