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

TypeScript两个等价泛型在函数体内处理结果不一致问题

现象原因

这个问题本质是TypeScript泛型约束的推导边界限制:TS不会跨中间泛型参数递归推导隐含的类型约束,只会检查每个泛型参数的直接上界。

  • 对于没有中间变量的InferredPermittedKeysNOError extends keyof Pick<AllKeysObj, GoodKeys>:
    TS在处理这个约束时,会当场计算Pick<AllKeysObj, GoodKeys>的键范围——Pick的第二个参数是GoodKeys,所以它的返回类型的键必然是GoodKeys的子集,TS会直接把InferredPermittedKeysNOError的上界识别为GoodKeys,自然满足GenericType的类型要求。
  • 对于用了中间变量的InferredPermittedKeysError extends keyof PermittedObj:
    虽然PermittedObj的约束是extends Pick<AllKeysObj, GoodKeys>,但TS在推导keyof PermittedObj的上界时,不会回溯PermittedObj的约束来缩小键的范围,只会把keyof PermittedObj的上界识别为最通用的string | number | symbol,自然不满足GenericType要求的extends GoodKeys约束。

如果想让中间变量的写法也生效,只需要给InferredPermittedKeysError加上明确的联合约束即可:

InferredPermittedKeysError extends keyof PermittedObj & GoodKeys

内容的提问来源于stack exchange,提问作者RestOfTheBothWorlds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:36:04