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
相关产品推荐
相关产品推荐

