#typescript #generics
Вопрос:
Не уверен, что название имеет смысл, но это было лучшее, что я мог придумать. Мне интересно, есть ли способ ввести защитный входной аргумент таким образом, чтобы объект мог содержать только значения данного типа (с универсальными), сохраняя при этом подробную информацию о типе. То, что я хочу сделать, это что-то вроде этого:
// Define a function with some generics
type QueryFn<R, T = undefined> = (params: T) => Promise<R>
// Specify an object that restricts all values to QueryFn
type QueryRegistry = Record<string, QueryFn>
// This is not allowed since the first generic must be specified
// but it is not known at this time so I would have to set it to `any`
Затем в каком-нибудь другом фрагменте кода:
// Define a registry with known generic types at compile time.
const registry: QueryRegistry = {
a: (fooParam: string) => heavyOperation(fooParam)
b: (barParam: number) => otherHeavyOperation(barParam)
}
// Use them in a type safe manner
a("abc") // allowed and returns proper type from heavyOperation
a(42) // not allowed
b(42) // allowed and returns proper type from otherHeavyOperation
b("abc") // not allowed
Проблема заключается в том, что информация о типе отдельных ключей теряется при определении реестра. Все, что я получаю для каждой функции, — это общий набор R, равный любому, потому что это то, что мне нужно будет сделать, когда я определю свой тип регистрации запросов.
Есть ли способ определить такой тип защиты, позволяя генерикам «проваливаться»?