Как определить этот тип

#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;