使用必填和部分输入

时间:2019-01-11 18:19:21

标签: typescript generics typescript-typings typescript-generics

我正在努力理解打字稿中的高级类型。

我想要一个既具有必需属性又没有必需属性的类型,但是我希望属性列表易于阅读。

我有一个必需属性列表作为一种类型,还有一个可选属性列表作为另一种类型。

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

1 个答案:

答案 0 :(得分:1)

问题

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

解决方案

将属性名称转换为使用它们的对象类型。第一种类型是键为BaseProperties且值的类型为string的对象。可以这样说:

Record<BaseProperties, string>

默认情况下,所有属性都是必需的,因此我们不需要Required帮助器。不过,第二种类型需要Partial

Partial<Record<Features, string>>

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

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