我正在努力理解打字稿中的高级类型。
我想要一个既具有必需属性又没有必需属性的类型,但是我希望属性列表易于阅读。
我有一个必需属性列表作为一种类型,还有一个可选属性列表作为另一种类型。
type BaseProperties =
| 'price'
| 'cost'
| 'location';
type Features =
| 'radio'
| 'wings'
| 'tires'
| 'rockets'
| 'slushie_machine';
我希望最终的类型是:
type WithFeatures = {
price: string;
cost: string;
location: string;
radio?: string | number;
wings?: string | number;
tires?: string | number;
rockets?: string | number;
slushie_machine?: string | number;
};
然后我想要一个数组:
public ThingsWithFeatures: WithFeatures[] = [];
我尝试过:
type WithFeatures = Required<BaseProperties> & Partial<Features>;
...不起作用。
我需要怎么做才能使用required和partial来获得如上所述的WithProperties
类型?
答案 0 :(得分:1)
问题
本身不是必需的BaseProperties
和Features
(它们只是字符串文字类型,Required<"foo">
只是"foo"
),而是带有它们的对象中的属性名称。
解决方案
将属性名称转换为使用它们的对象类型。第一种类型是键为BaseProperties
且值的类型为string
的对象。可以这样说:
Record<BaseProperties, string>
默认情况下,所有属性都是必需的,因此我们不需要Required
帮助器。不过,第二种类型需要Partial
。
Partial<Record<Features, string>>
最终形状是这两个形状的交点(&
)。
type WithFeatures = Record<BaseProperties, string> & Partial<Record<Features, string>>;