如何在TypeScript中定义两个泛型类型的同类型字段?
确保TypeScript泛型函数中两个属性类型一致的方法
你可以通过新增一个共享泛型类型来约束T[KL]和R[KR]的类型完全匹配,具体实现如下:
简洁版函数定义
直接在泛型约束里让R[KR]和T[KL]类型绑定:
function foo< T, R, KL extends keyof T, KR extends keyof R & { [K in keyof R]: R[K] extends T[KL] ? K : never }[keyof R] >(lft: T, rgh: R, kl: KL, kr: KR): void { // 函数逻辑 }
更直观的写法
新增泛型V作为两个属性的共同类型,再分别约束T[KL]和R[KR]匹配V:
function foo< T, R, KL extends keyof T, V = T[KL], KR extends keyof R & (R[KR] extends V ? KR : never) >(lft: T, rgh: R, kl: KL, kr: KR): void { // 函数逻辑 }
测试验证
const obj1 = {id: 1, name: "foo"}; const obj2 = {oid: 2, score: 98} foo(obj1, obj2, 'id', 'oid'); // 合法,number类型匹配 foo(obj1, obj2, 'name', 'oid'); // 编译失败,string与number类型不兼容
原理说明
通过泛型约束,TypeScript会自动校验R[KR]的类型是否和T[KL]完全一致:
- 类型匹配时,
KR会被正常推断为R的合法键 - 类型不匹配时,
KR会被推断为never,直接触发编译报错
内容的提问来源于stack exchange,提问作者Enix
相关产品推荐
相关产品推荐

