创建特定类型:多数键仅支持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
相关产品推荐
相关产品推荐

