Я хочу обернуть свои методы службы в метод cachify, который проверяет кеш перед запросом к базе данных. Однако я не могу сохранить объявление типа обернутой функции.
Функция упаковки cachify выглядит так:
// cache.ts
const cachify = async <T>(fn, args): Promise<T> => {
const key = constructHashKey(args)
const cachedEntry = get(key)
if (cachedEntry) {
return cachedEntry
} else {
const entry = await fn(...args)
put(key, entry)
return entry
}
}
Вот пример использования функции переноса:
// userService.ts
const getUserProfilePhotoUrl = async (id: string, size: string): Promise<string> => {
return cachify<string>(fetchPhotoUrl, [
id,
size
])
}
Функция fetchPhotoUrl имеет сигнатуру (id: string, size: string): Promise<string>.
Однако, если я добавлю какой-нибудь произвольный аргумент в массив [id, size], я не получу никаких ошибок типа. Как мне сообщить об этом Typescript?






Вы можете получить желаемое поведение, вам просто нужно добавить некоторые параметры типа в функцию, чтобы зафиксировать фактические типы передаваемых параметров.
const cachify = async <T, A extends [any] | any[]>(fn: (...a: A) => Promise<T>, args: A): Promise<T> => {
const key = constructHashKey(args)
const cachedEntry = get(key)
if (cachedEntry) {
return cachedEntry
} else {
const entry = await fn(...args)
put(key, entry)
return entry
}
}
declare function fetchPhotoUrl(id: string, size: string): Promise<string>;
const getUserProfilePhotoUrl = async (id: string, size: string): Promise<string> => {
return cachify(fetchPhotoUrl, [
id,
size
])
}
Если все, что вы будете делать, это просто пересылать параметр в этой версии, это может упростить задачу:
const cachify = <T, A extends [any] | any[]>(fn: (...a: A) => Promise<T>): ((...args: A) => Promise<T>) => {
return async function (...args: A) {
const key = constructHashKey(args)
const cachedEntry = get(key)
if (cachedEntry) {
return cachedEntry
} else {
const entry = await fn(...args)
put(key, entry)
return entry
}
}
}
declare function fetchPhotoUrl(id: string, size: string): Promise<string>;
const getUserProfilePhotoUrl = cachify(fetchPhotoUrl)
getUserProfilePhotoUrl("id", "");
getUserProfilePhotoUrl полностью безопасен для типов, вы получаете всплывающую подсказку для имен параметров, если наводите курсор на функцию, но не при фактическом завершении кода (это должно быть исправлено в будущем).