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

创建特定类型:多数键仅支持A/B类型,仅key2支持C类型

解决方案

你尝试的代码存在类型冲突问题:索引签名[key: string]: A | B要求所有对象键的值都必须属于A | B类型,但key2的类型是C,而C并不包含在A | B中,导致TypeScript会抛出类型错误。

以下是满足需求的正确实现方式:

方式一:映射类型(支持任意字符串键)

type A = "val a"
type B = "val b"
type C = "val c"

// 对每个字符串键K,根据是否为"key2"分配对应类型
type T = {
  [K in string]: K extends "key2" ? C : A | B;
};

// 符合要求的对象
const obj1: T = {
  key1: "val a",
  key2: "val c",
  key3: "val b",
};

// 错误示例:非key2键使用C类型会触发报错
const obj2: T = {
  key1: "val c", // 类型错误:"val c"不能赋值给类型A | B
  key2: "val c",
};

方式二:交叉类型(明确key2为必选,其余键可选)

如果需要key2必须存在,其他键可选,可以用交叉类型结合Partial实现:

type T = {
  key2: C;
} & Partial<Record<Exclude<string, "key2">, A | B>>;

// 符合要求的对象(可以只包含key2)
const obj3: T = {
  key2: "val c",
};

原理说明

  • 映射类型通过遍历所有字符串键,对key2单独指定C类型,其余键限定为A | B,严格满足"仅key2可用C,其他键只能用A/B"的约束。
  • 交叉类型方案则通过固定key2的类型,同时用Partial<Record<...>>定义其他可选键的类型范围,更灵活适配不同的对象结构需求。

内容的提问来源于stack exchange,提问作者Daniel de Andrade Varela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:22:27