使用必填和部分类型
Type Using Both Required and Partial
我很难理解 Typescript 中的高级类型。
我想要一个既具有必需属性又具有非必需属性的类型,但我希望属性列表易于阅读。
我有一个必需属性列表作为一种类型,还有一个可选属性列表作为另一种类型。
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
类型?
问题
不是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>>;
我很难理解 Typescript 中的高级类型。
我想要一个既具有必需属性又具有非必需属性的类型,但我希望属性列表易于阅读。
我有一个必需属性列表作为一种类型,还有一个可选属性列表作为另一种类型。
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
类型?
问题
不是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>>;