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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:05:54