Pull to refresh

Comments 6

Есть небольшая обратная связь.

В основном замечания по форме.

Я уже более 7 лет активно использую TypeScript, применяя его в самых разных сценариях — от простых типизированных переменных до сложных условных типов и интерполяции. Однако TypeScript продолжает удивлять: сегодня я открыл для себя ещё один элегантный сценарий использования автовыведения типов в дженериках и функциях.

Сколько я себя помню, документация ТС по дженерикам всегда использовала что-то типа:

function identity<Type>(arg: Type): Type {
  return arg;
}

let output = identity<string>("myString");

let output = identity("myString");

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

Одна и та же функция fetchFile работает с любым API-методом, возвращающим Blob

Не понял причем тут Blob. В статье нигде не упоминается больше.

А вот тут, по моему, известная тема, когда выдираешь из какого-то контекста код и поэтому не очень понятно зачем это нужно

const createApiCall = <TResponse, TParams>(fetcher: (params: TParams) => TResponse)=> {
  return (params: TParams) => fetcher(params);
};

const getUser = createApiCall(API.getUser); // TParams выводится из API.getUser

Если я правильно понял, весь код эквивалентен обычному вызову API.getUser. А так как это TS, то никакого смысла в createApiCall нет. Т.е. лучше какого-нибудь контекста навалить, что бы понятно было для чего оно такое нужно.

Это же предложение и к следующему примеру с useFetch , который в принципе бессмысленный в том виде в котором приведен.

Явно указывайте типы только в сложных случаях.

Кстати, ваш пример выше показал, почему так может делать и не стоит

const useFetch = <TData>(url: string) => {
  const [data, setData] = useState<TData | null>(null);
  // ...
};

const { data } = useFetch("/api/users"); // TData выводится из возвращаемого значения API

Вы забыли после ... указать return. Подобную ошибку можно допустить и в рабочем коде, и тогда TC ничем не поможет.

А вот если явно написать: const useFetch = <TData>(url: string): TData тогда TS подсветит проблему

Добрый день, Виталий.
Спасибо за замечания, есть над чем задуматься.

Мало контекста сделал намеренно, что бы заострить внимание на том как может отработать выведение типов в одном из частных случаев. Ибо побоялся отвлечь читателя в сторону рассмотрения вопроса зачем и где может пригодиться данный способ написания функций.

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

Автовывод типов очень портит читаемость

Это легко решается включением подсказок

Sign up to leave a comment.

Articles