должн быть как и входная fn ?
Сейчас эта функция вернёт Promise<void>, а должен быть Promise<return type fn>
Насколько я знаю, промисы - очень сложный механизм, и без насильной подсказки тс умеет инферить тип только в очень простых случаях
Через явный дженерик можно. Но вот глупо( Копировать тип функции через ReturnType когда он и так известен
Делал похожую штуку на реакте (реакт) хук import { useState } from 'react'; export function useApiRequest< R = unknown, P extends unknown[] = unknown[], E = unknown, >(requestCb: (...requestParams: P) => Promise<R>) { const [data, setData] = useState<R | null>(null); const [error, setError] = useState<E | null>(null); const [isLoading, setIsLoading] = useState<boolean>(false); const load = async (...params: P) => { try { setIsLoading(true); setData(null); setError(null); const res = await requestCb(...params); setData(res); } catch (e) { setError(e as E); setData(null); } finally { setIsLoading(false); } }; return { data, error, isLoading, load }; } Это типа хук который так вызываю const fetchAsteroidListRequest = useApiRequest( asteroidListApi.fetchAsteroidList, ); // и собственно вызов функции которая провоцирует вызов переданного в хук калбека fetchAsteroidListRequest.load(startDate, endDate); так вот по типизацию параметров эта функция выдергивает из переданного колбека а результат вызова передается в fetchAsteroidListRequest.data и он будет такого же типа как то что возвращает переданный в хук калбэк в принципе я со вью не работал но принцип вроде такой же должен быть
Условно, ТС/джс не знает, когда там ивент-луп "прокрутится". У каждого рантайма (хост-среды) своя реализация. И если resolve там спрятан где-то за таймаутом (не часть джс), ТС не может знать какой из resolve выполнится. Потому что ТС не знает, в какой хост-среде выполняется промис Ваш пример на ВУЕ переусложнен. Можно проще пример привести того, что тс не умеет промис без подсказки
я тебе больше скажу, тайпскрипта в рантайме вообще нет
Не совсем то. У тебя работа идет с data. А я в data хочу класть нужные мне данные (через парсер получаются), но в добавок что бы load был по типу как и requestCb что бы в нужном кейсе я мог использовать "сырой" ответ т.к. в ответе на пример load я возвращаю нашу функцию обратно
Вот поэтому и большая часть джс не типизируется в ТС - от слова совсем. Взять хотя бы переопределение prototype объекта в рантайме
https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
Ну можно второй дженерик попробовать добавить и привязать возвращаемое значение к нему как я дату привязываю у результату колбэка
Это к чему было? Я ни слова про классы не сказал Как ТС типизирует Object.setPrototypeOf(myObj, something) ? Я могу эту команду сотни раз в рантайме выполнить
ну так никакой язык с типизацией не дает гарантии то что касается метапрограммирования в рантайме
Обсуждают сегодня