Как повторно использовать общий аргумент в интерфейсе?

#typescript #typescript-typings #typescript-generics

Вопрос:

У меня есть два типа с одинаковыми общими значениями:

 type MutationType = UseMutationResult<
  AxiosResponse<IUser>,
  unknown,
  IUser,
  unknown
>;

type MutationOptions = UseMutationOptions<
  AxiosResponse<IUser>,
  unknown,
  IUser,
  unknown
>;
 

Можно ли повторно использовать аналогичный тип? Что-то вроде:

 // Some syntax
type T = ... <AxiosResponse<IUser>,unknown,IUser,unknown>;

type MutationType = UseMutationResult<T>;
type MutationOptions = UseMutationOptions<T>;
 

Ответ №1:

Для тесно связанных типов вы можете использовать infer для получения сложных типов из сложных элементов, из которых был создан оригинал.

Эта игровая площадка содержит пример, когда один тип распаковывает сложные биты другого типа с помощью infer. Reverse упрощает создание ReversedNumberOperation , получая сведения о типе NumberOperation без указания чего-либо об number или NumberOperationNames .

 type Operation <A,B,C> = [A,B,C];

type ReversedOperation<A,B,C> = [C,B,A];

type Reverse<T extends Operation<any,any,any>> = T extends Operation<infer A, infer B, infer C> ? ReversedOperation<A,B,C> : never;

type NumberOperationName = "add" | "subtract" | "multiply" | "divide"

type NumberOperation = Operation<NumberOperationName, number,number>;

type ReversedNumberOperation = Reverse<NumberOperation>;

const reversedNumberOperation:ReversedNumberOperation = [4,3,"multiply"]; 
 

У меня и раньше возникало искушение пойти по этому пути, но обычно я решал, что оно того не стоит по сравнению с тем, чтобы все было ясно.

Комментарии:

1. Пришлось несколько раз исправлять свой ответ. Исходный пример был шонки, а затем, когда я скопировал ссылку на новую игровую площадку с улучшенной версией, возникли проблемы с форматированием редактора, которые требовали нескольких обходов, прежде чем StackOverflow правильно отобразит блок кода.