Могу ли я определить ограничение универсального типа для ключей DU?

#typescript #typescript-generics

#typescript #typescript-generics

Вопрос:

Есть ли способ определить ограничение общего типа таким образом, чтобы

 //this will compile
type Contrained = StrongConstraint<"a" | "b" | "c", "a" | "b">

//this wont compile as "a" | "b" | "d" is not a strict subset of "a" | "b" | "c"
type Contrained = StrongConstraint<"a" | "b" | "c", "a" | "b" | "d">
  

Это похоже на Exclude just stronger, поскольку мне не нравятся ключи во втором параметре, которые не являются частью первого.

Ответ №1:

Вы можете заставить второй параметр расширить первый:

 type ExcludeConstrained<T, U extends T> = Exclude<T, U>

type T1 = ExcludeConstrained<"a" | "b" | "c", "a" | "b">; // OK, T1 = 'c'

type T2 = ExcludeConstrained<"a" | "b" | "c", "a" | "b" | "d">; // ERROR
// -----------------------------------------> ~~~~~~~~~~~~~~~
// Error: Type '"d"' is not assignable to type '"a" | "b" | "c"'
  

Ответ №2:

Я не думаю, что ваш подход возможен (по крайней мере, я не в курсе). Однако, в зависимости от вашего варианта использования, вы можете проверить Partial .

 type StrongConstraint<T> = {
    left: T,
    right: Partial<T>,
}

// success
const foo: StrongConstraint<'a' | 'b' | 'c'> = {
    left: 'a',
    right: 'b'
}

// fail
const bar: StrongConstraint<'a' | 'b' | 'c'> = {
    left: 'a',
    right: 'd'
}