Альтернатива моей функции, перегружающей сигнатуру для решения моей проблемы в Typescript - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть сценарий, где у меня есть fn, который выполняет запрос к конечной точке x. Этот запрос принимает много разных типов тел, но для каждого ответ всегда известен. Пример:

 interface RequestA {
  reqA1: string;
  reqA2: number;
}

interface RequestB {
  reqB1: string;
  reqB2: number;
}

interface RequestC {
  reqC1: string;
  reqC2: number;
}

interface ResponseA {
  resA1: string;
  resA2: number;
}
interface ResponseB {
  resB1: string;
  resB2: number;
}
interface ResponseC {
  resC1: string;
  resC2: number;
}

type Requests = RequestA | RequestB | RequestC;

type GetResponseType<T> = T extends RequestA ? ResponseA : T extends RequestB ? ResponseB : T extends RequestC ? ResponseC : never;

const makeRequest = <T extends Requests>(a: T) => {
   return fetch(body) as GetResponseType<T>;
}

при использовании:

const obj = { reqA1: 'hello', reqA2: 123}

const response = makeRequest(obj) // response would give me then access to both resA1 and 
resA2;

Это работает, фактически выполняет то, что я хочу, с точки зрения пользователя функции makeRequest не нужно предоставлять какой-либо тип, этопросто потребляет, и на основе входных данных, которые он предоставляет, он вернет вам возврат. Я просто упомянул, что я также выполнил перегрузку функции, в которой вы просто пишете перегрузку makeRequest со всеми предоставленными комбинациями пар, но я хотел сделать это способом копирования / вставки или скрытым логическим способом работы с машинописью. Тогда мой вопрос: можно ли улучшить этот метод?

Заранее спасибо ..

...