如何在TypeScript中创建仅接受两对象同类型值键的接口?
实现类型关联的TypeScript类型C
要实现仅接受A和B中属性类型匹配的键组合,无法直接用普通接口(因为接口中aKey和bKey的类型是独立的,无法建立关联约束),需要通过映射类型+联合类型来生成符合要求的类型集合:
解决方案代码
interface A { aString: string; aNumber: number; } interface B { bString: string; bNumber: number; } // 映射类型:为A的每个键,匹配B中同类型的键 type AtoB = { [K in keyof A]: { aKey: K; bKey: { [L in keyof B]: B[L] extends A[K] ? L : never }[keyof B]; } }; // 将映射类型展开为联合类型,得到所有合法的键组合 type C = AtoB[keyof A];
验证效果
const c1: C = { // ✅ 合法:类型匹配 aKey: 'aString', bKey: 'bString', } const c2: C = { // ❌ 报错:类型不匹配 aKey: 'aString', bKey: 'bNumber', }
代码原理说明
AtoB映射类型:遍历A的每个键K,针对每个K再遍历B的所有键L,只保留那些B[L]类型与A[K]兼容的L,最终生成对应{aKey: K, bKey: 合法L集合}的类型。C联合类型:通过AtoB[keyof A]将映射类型的所有值提取出来,形成包含所有合法键组合的联合类型,TypeScript会自动对联合类型的成员做校验,确保aKey和bKey的类型严格匹配。
内容的提问来源于stack exchange,提问作者viniyoon
相关产品推荐
相关产品推荐

