如何定义含部分已知键、其余键结构固定的TypeScript对象类型?
TypeScript 对象类型正确定义方案
场景回顾
需要定义一个对象类型:
- 必含属性:
foo(number类型)、bar(string类型) - 可选属性:键只能是
baz/foobaz,或允许任意额外键,但所有可选属性的值必须是包含foobar(number类型)的对象
以下是两种对应需求的正确写法:
方案一:仅允许指定的可选属性(baz/foobaz)
如果只需要支持baz和foobaz作为可选属性,用交叉类型合并必选属性与映射类型即可解决原写法的语法冲突:
type MyList = 'baz' | 'foobaz'; type MyObject = { foo: number; bar: string; } & { [key in MyList]?: { foobar: number; }; };
原理
将必选属性单独定义在一个对象类型中,再通过映射类型生成指定可选属性的类型,最后用交叉类型&合并两者,避开了在同一对象类型中混用显式属性与映射类型的语法限制。
方案二:允许任意符合结构的额外属性
如果需要支持任意字符串键的可选属性(只要值符合{foobar: number}结构),可以用条件映射类型+交叉类型实现:
type MyObject = { [K in string]?: K extends 'foo' ? number : K extends 'bar' ? string : { foobar: number }; } & { // 强制foo、bar为必选属性 foo: number; bar: string; };
原理
- 用映射类型遍历所有字符串键,通过条件判断为不同键分配对应类型:
foo设为number、bar设为string,其余键设为{foobar: number}且可选 - 通过交叉类型强制
foo和bar为必选属性,覆盖映射类型中默认的可选设置
内容的提问来源于stack exchange,提问作者zkwsk
相关产品推荐
相关产品推荐

