Тип с использованием как обязательных, так и частичных - PullRequest
0 голосов
/ 11 января 2019

Я изо всех сил пытаюсь понять Расширенные типы в 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>;

... который не работал.

Что мне нужно сделать, чтобы использовать обязательный и частичный, чтобы получить тип WithProperties, как описано?

1 Ответ

0 голосов
/ 11 января 2019

Задача

Это не 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>>;
...