Как сказал Даниэль в предыдущем сообщении, мы можем вывести универсальные типы из параметров. Проблема в том, что функция может содержать несколько универсальных типов, и TypeScript не позволяет опускать некоторые из них (однако вы можете опустить все). Итак, вот обходной путь к проблеме:
const createRecord = <S, T extends string>(type: T, data: S) => ({ type, data })
const r = createRecord('TYPE_1', 101)
// type of `r` is const r: { type: "TYPE_1"; data: number; }
Обратите внимание, что универсальные типы T
и S
выводятся из параметров type
и data
. Однако вы не можете сделать это:
const createRecord = <S, T extends string>(type: T, data: S) => ({ type, data })
const r = createRecord<number>('TYPE_1', 101)
// Expected 2 type arguments, but got 1.
Также обратите внимание, что T
должен расширять строку для получения строкового литерала (в противном случае тип будет просто string
).