如何创建含可选动态字符串联合属性名的TypeScript Record类型?
解决方案
要实现预定义属性名且全部可选的对象类型,同时支持动态增减属性列表,直接用TypeScript内置的Partial工具类型配合Record即可解决问题:
修改后的代码
type options = 'one' | 'two' | 'three'; // 用Partial将Record生成的必填属性转为可选 type List = Partial<Record<options, string>>; // 合法 const MyObjOne: List = { one: 'Value 1', two: 'Value 2', three: 'Value 3', } // 现在合法 const MyObjTwo: List = { one: 'Value 1', two: 'Value 2', } // 单个属性也合法 const MyObjThree: List = { three: 'Value 3', } // 空对象同样合法 const MyObjFour: List = {}
原理说明
Record<options, string>会生成一个所有属性必填的对象类型,这也是你之前代码报错的原因——它要求必须包含所有预定义属性。Partial<T>是TypeScript内置工具类型,作用是将传入的类型T中所有属性转为可选类型。两者结合后,就得到了"属性名预定义、全部可选"的对象类型。- 当需要动态增减可选属性时,只需要修改
options联合类型的成员即可,无需逐个调整对象类型的属性定义,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Advait Junnarkar
相关产品推荐
相关产品推荐

