You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:48:04