Допустим у меня есть 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 типа - то самое единственное значение, что есть в массиве... Ничего не понимаю...