Сделайте условие ИЛИ для универсального - PullRequest
0 голосов
/ 09 июля 2020

Рассмотрим тип

type Smth<T, U> = ...

Теперь я хочу проверить, является ли T string OR U примитивным.

Я могу проверить условия отдельно

type AreSame<T, U, Y, N> = (<X>() => X extends T ? 1 : 2) extends (<X>() => X extends U ? 1 : 2) ? Y : N
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
type IfPrimitive<T, Y, N> = T extends string | number | boolean | symbol | bigint | null | undefined ? IfAny<T, N, Y> : N

type Smth1<T, U> = AreSame<T, string, true, false>
type Smth2<T, U> = IfPrimitive<U, true, false>

, но как присоединиться к ним через or?

1 Ответ

1 голос
/ 09 июля 2020

Просто поместите второе условие в ложную ветвь первого:

type AreSame<T, U, Y, N> = (<X>() => X extends T ? 1 : 2) extends (<X>() => X extends U ? 1 : 2) ? Y : N
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
type IfPrimitive<T, Y, N> = T extends string | number | boolean | symbol | bigint | null | undefined ? IfAny<T, N, Y> : N

type Smth<T, U> = AreSame<T, string, true, IfPrimitive<U, true, false>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...