Сопоставить все теги тегового типа объединения в TypeScript - PullRequest
0 голосов
/ 21 января 2019

Можно ли отобразить все теги тегового типа объединения в массив? Допустим, у нас есть следующие типы:

type Options = Cash | PayPal | CreditCard;    

interface Cash {
  kind: "cash";
}

interface PayPal {
  kind: "paypal";
  email: string;
}

interface CreditCard {
  kind: "credit";
  cardNumber: string;
  securityCode: string;
}

Можно ли собрать все дискриминаторы kind в строковый массив? Результат должен быть примерно таким: ['cash', 'paypal', 'credit'].

Заранее спасибо!

1 Ответ

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

Нет способа получить значения из типа в стандартном машинописном тексте (могут быть некоторые неофициальные расширения языка, которые допускают это)

Вы можете получить тип, который является объединением всех kind s:

type OptionsKind = Options['kind'] //  "cash" | "paypal" | "credit"

Вы также можете создать объект, который ДОЛЖЕН иметь все свойства объединения, и использовать Object.keys для получения массива из этого объекта:

type OptionsKind = Options['kind'] //  "cash" | "paypal" | "credit"
let OptionsKind: { [P in OptionsKind]: 1 } = {
    cash: 1,
    credit: 1,
    paypal: 1        
}
let OptionsKindArray = Object.keys(OptionsKind);

Это решение гарантирует, что вы получите сообщение об ошибке, если у вас есть какие-либо дополнительные ключи в объекте, если у вас нет всех ключей в объекте и если вы ошиблись в написании каких-либо ключей. Таким образом, в основном это гарантирует, что повторяющиеся данные, по крайней мере, всегда актуальны.

Вы можете даже создать вспомогательную функцию для любого объединения:

type OptionKinds = Options['kind'] //  "cash" | "paypal" | "credit"
function unionValues<T extends string>(o: Record<T, 1>) {
    return Object.keys(o) as T[];
}

let OptionKinds = unionValues<OptionKinds>({ cash: 1, paypal: 1, credit: 1 }); 
...