@artr_lr

Проверка значений массива?

Допустим у меня есть union тип
type U = 'foo' | 'bar';

Как мне убедиться, что массив, содержит все эти значения?
Я пытался примерно так:
type Validator<U extends string, A extends ReadonlyArray<string>> =
  A[number] extends U
    ? U extends A[number]
      ? A
      : never
    : never;
  
type U = 'foo' | 'bar';
const arr = ['foo'] as const;

type R = Validator<U, typeof arr>;

Всё тайпчекается нормально... Тайпскрипт выводит ['foo']. Хотя я ожидал увидеть ошибку!

Причём, если я перепишу так:
type Validator<U extends string, A extends ReadonlyArray<string>> =
  A[number] extends U
    ? U extends A[number]
      ? U
      : never
    : never;

То вывод типа покажет, что он берёт конкретное значение 'foo' из union типа - то самое единственное значение, что есть в массиве... Ничего не понимаю...
  • Вопрос задан
  • 39 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
type Validator<U extends string, A extends ReadonlyArray<string>> =
  (U extends A[number] ? true : false) extends true ? A : never;
  
type U = 'foo' | 'bar';
const arr0 = ['foo'] as const;
const arr1 = ['bar'] as const;
const arr2 = ['foo', 'bar'] as const;

type A0 = Validator<U, typeof arr0>; // never
type A1 = Validator<U, typeof arr1>; // never
type A2 = Validator<U, typeof arr2>; // readonly ['foo', 'bar']

const _check0: A0 = arr0; // error
const _check1: A1 = arr1; // error
const _check2: A2 = arr2;

https://www.typescriptlang.org/play?#code/C4TwDgpg...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы