#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'
}