如何在TypeScript中定义含可选同类型多键与唯一布尔键的对象接口
解决TypeScript对象接口的混合类型定义问题
你可以通过交叉类型或者接口扩展映射类型的方式实现需求,既保证多个可选键的类型统一,又单独约束唯一布尔键的类型:
方法一:使用交叉类型(&)
先单独定义映射类型处理那些可选的同类型键,再和包含固定布尔键的对象类型做交叉:
// 定义可选键的联合类型 type MyStringKeys = 'String 1' | 'String 2' | 'String 10'; // 交叉映射类型与固定属性类型 type MyObjectType = { [K in MyStringKeys]?: MyInterface } & { valid: boolean };
使用示例:
// 合法:仅包含必填的valid键 const foo: MyObjectType = { valid: true }; // 合法:包含valid和部分可选键 const bar: MyObjectType = { valid: false, 'String 1': { /* MyInterface实例内容 */ } }; // 报错:'String 2'的值必须是MyInterface类型,不能为布尔值 const baz: MyObjectType = { valid: true, 'String 2': true };
方法二:接口扩展映射类型
如果需要用接口形式定义,先抽离映射类型,再让接口扩展它并添加固定属性:
type MyStringKeys = 'String 1' | 'String 2' | 'String 10'; type MyMappedType = { [K in MyStringKeys]?: MyInterface }; interface MyObjectInterface extends MyMappedType { valid: boolean; }
使用方式和方法一完全一致,这种写法更适合需要复用接口的场景。
为什么之前的写法不生效?
- 第一种写法把映射类型和固定属性直接写在同一个对象类型里,TypeScript语法规则不允许映射类型内部额外声明属性,因此抛出
A mapped type may not declare properties or methods.错误。 - 第二种写法将
valid与其他键合并成联合类型,导致所有键都被允许为boolean | MyInterface类型,破坏了原本的类型约束。
内容的提问来源于stack exchange,提问作者Hrishikesh Kokate
相关产品推荐
相关产品推荐

