Подтвердить что ты не робот

Поток: динамически генерировать типы объединения строк?

Скажем, у меня есть тип потока Suit, и я хочу скомпоновать его в другой тип, называемый Card.

// types.js

type Suit =
  | "Diamonds"
  | "Clubs"
  | "Hearts"
  | "Spades";


type Card = {
  ...
  suit: Suit,
  ...
}

Вместо жесткого кодирования в строках Suit непосредственно в suit.js можно ли динамически генерировать тип Suit на основе примитива (массива) JavaScript? Скажи...

// constants.js

const SUITS = ['Diamonds', 'Clubs', 'Hearts', 'Spades'];

Таким образом, костюмы могут быть определены только один раз и внутри конструкции JavaScript, которая будет использоваться для повторного использования в других разделах приложения. Например, компонент в другом месте приложения, которому нужен доступ ко всем доступным требованиям:

// component.js

SUITS.map((suit: Suit): void => { ... });
4b9b3361

Ответ 1

Это действительно возможно с использованием типа утилиты $Keys:

const SUITS = {
    Diamonds: 'Diamonds',
    Clubs: 'Clubs',
    Hearts: 'Hearts',
    Spades: 'Spades',
};

type Suit = $Keys<typeof SUITS>

const suit1 : Suit = 'Diamonds'; // OK
const suit2 : Suit = 'Foo'; // Type error

Обратите внимание, что для этого примера значения в SUITS на самом деле не имеют значения, поток будет смотреть на клавиши в SUITS. type Suit будет похож на тип объединения type Suit = 'Diamonds' | 'Clubs' | ...