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

如何在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',
}

代码原理说明

  1. AtoB映射类型:遍历A的每个键K,针对每个K再遍历B的所有键L,只保留那些B[L]类型与A[K]兼容的L,最终生成对应{aKey: K, bKey: 合法L集合}的类型。
  2. C联合类型:通过AtoB[keyof A]将映射类型的所有值提取出来,形成包含所有合法键组合的联合类型,TypeScript会自动对联合类型的成员做校验,确保aKey和bKey的类型严格匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:22:34