Я экспортировал функцию из какого-то модуля, которая выглядит следующим образом:
export function MyFunc<A>() {
return {
foo: (in: A) => void
}
}
Теперь, в каком-то другом модуле, я хочу поговорить о различных типах возврата MyFunc
.Поскольку я не экспортировал тип, я буду использовать typeof
, чтобы получить тип, который я хочу, учитывая значение MyFunc
. В идеале я бы сделал следующее :
import { MyFunc } from "mymodule";
type MyFuncReturned<A> = ReturnType<typeof MyFunc<A>>;
function foo(): MyFuncReturned<string> {
// ...
}
Хммм, это не работает;typeof
может быть передано только значение, и мне не нравится моя попытка указать общий тип этого значения.
Лучшее, что я могу сделать, - это убедить TypeScript вывести определенные типы MyFunc
из значений Iсоздал, а затем дал им псевдонимы отдельных типов, например:
const myFuncStringReturn = MyFunc<string>();
type MyFuncStringReturn = typeof myFuncStringReturn;
Чтобы не запускать MyFunc
просто для получения информации о типе, я могу скрыть его за функцией и использовать ReturnType
наit:
const myFuncStringReturn = () => MyFunc<string>();
type MyFuncStringReturn = ReturnType<typeof myFuncStringReturn>;
const myFuncBoolReturn = () => MyFunc<bool>();
type MyFuncBoolReturn = ReturnType<typeof myFuncBoolReturn>;
Это дает мне возможность, по одному типу за раз, говорить о различных типах возврата MyFunc
, но это
- Включает фактический код времени выполнениябыть написано, что TS может сделать вывод из.
- Не позволяет мне говорить о
MyFunc
в более общем смысле.
Единственное «правильное» решение, которое я могу придумать, - это дублировать кучу информации типа, когдаЯ заявляю MyFunc
:
export function MyFunc<A>(): MyFuncReturns<A> {
return {
foo: (in: A) => void
}
}
export type MyFuncReturns<A> = {
foo: (in: A) => void
}
Но теперь, когда я изменяю MyFunc
, я должен обеспечить синхронизацию MyFuncReturns
с ним.
Есть лиВ любом случае я могу получить такой тип, как MyFuncReturns<A>
, учитывая только наше экспортированное значение MyFunc
, без необходимости добавлять код времени выполнения или шаблон выше?