#typescript
Вопрос:
У меня есть общая функция, определенная следующим образом:
function foo<T extends Record<string, unknown>>(arg1: string, arg2: string): Promise<T> {
// Could get data from network
return Promise.resolve({ arg1, arg2 } as any as T);
}
Я хочу сгенерировать ряд универсальных функций, которые принадлежат:
const foo1 = foo.bind(null, 'a');
const foo2 = foo.bind(null, 'b');
// ...
Мой вопрос: Как добавить явное объявление типа для foo1, foo2 и т. Д.?
Я пытаюсь добавить объявление типа следующим образом:
type B = <T extends Record<string, unknown>>(arg2: string) => Promise<T>;
const foo1: B = foo.bind(null, 'a');
Это работает в одном проекте машинописи, но в моем новом проекте машинописи это не работает. Я получил ошибку сборки, как показано ниже:
TS2322: Type '(arg2: string) => Promise<Record<string, unknown>>' is not assignable to type 'B'.
Type 'Promise<Record<string, unknown>>' is not assignable to type 'Promise<T>'.
Type 'Record<string, unknown>' is not assignable to type 'T'.
'Record<string, unknown>' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Record<string, unknown>'.
Спасибо
Комментарии:
1. Зачем мне нужно добавлять объявление типа в новые функции? Если нет, я не могу использовать
foo1
в качестве универсальной функции, напримерfoo1<{data: string, error: string}>(arguments)
.
Ответ №1:
Теперь я использую следующий обходной путь для этой проблемы.
const foo1 = foo.bind(null, 'a') as any as B;