使用必填和部分类型

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 类型?

问题

不是BasePropertiesFeatures本身需要的(它们只是字符串文字类型,Required<"foo">只是"foo"),而是对象中的属性以他们的名字命名。

解决方案

将您的 属性 名称转换为使用它们的对象类型。第一种类型是一个对象,其中的键是 BaseProperties,值是 string 类型。可以这样构造:

Record<BaseProperties, string>

默认情况下需要所有属性,因此我们不需要 Required 助手。第二种类型我们需要 Partial

Partial<Record<Features, string>>

最终形状是这两个的交集(&)。

type WithFeatures = Record<BaseProperties, string> & Partial<Record<Features, string>>;