Получить "значения" элементов объединения в TypeScript? - PullRequest
1 голос
/ 12 апреля 2020

Учитывая тип объединения:

type Valid = 'a' | 'b' | 'c'

Можно ли извлечь?

const VALID_VALUES = valuesOf(Valid);
console.log(VALID_VALUES);
// ['a', 'b', 'c']

Другими словами, противоположность typeof

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

Нет, типы не существуют в переданном коде, поэтому не было бы источника, из которого можно преобразовать VALID_VALUES.

Вы можете сделать это наоборот, хотя, если вы хотите сделать вещи DRY:

const VALID_VALUES = ['a', 'b', 'c'] as const;
type Valid = typeof VALID_VALUES[number];
1 голос
/ 12 апреля 2020

Да и нет, я бы сказал. Есть способ, но я не рекомендую делать это хотя бы полностью во время выполнения, потому что это замедляет работу вашей программы. Возможно, сгенерируйте код, необходимый для проверки, и время сборки, чтобы вы делали это только один раз.

Одним из решений было бы использование API компилятора TS (для этого есть хорошая оболочка https://ts-morph.com/)

import { Project, SyntaxKind } from "ts-morph";

const project = new Project();
const source = project.addSourceFileAtPath("src/api/valid-types.ts");
const type = source.getFirstChildByKind(SyntaxKind.TypeAliasDeclaration);

if (type) {
  const props = type
    .getType()
    .getUnionTypes()
    .map((t) => t.getText().slice(1, -1));

  console.log(props); // => ["a", "b", "c"]
}

Вот список немногих проектов, которые взяли эту идею на следующий уровень

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...