Как получить тип возвращаемого значения из обратного вызова в Typescript - PullRequest
2 голосов
/ 28 июня 2019

У меня есть код, который выглядит следующим образом:

validateViaTransaction(
  id: string,
  datas: any,
  callback: <T> (t: firestore.Transaction, data: any) => Promise<T>
) => {
  return await firestore().
   runTransaction(async t => {
    get someting...

    validate something and throw err...

    return await callback(t, data);

   }).catch(err => { throw err; });
}

сейчас, когда я пытаюсь использовать позже:

await validateViaTransaction(id, null, (t: firestore.Transaction) => {
 t.set(new data here...., {merge: true});

 return "Validation Successful";
})

сейчас, когда я проверяю тип возвращаемого кода, это Обещание <unknown>

, и когда я внедряю его в код, ошибка выглядит следующим образом.

Argument of type '(t: Transaction) => string' is not assignable to parameter of type '<T>(t: Transaction, data: any) => T'.
  Type 'string' is not assignable to type 'T'.
    'string' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '{}'.ts(2345)

Есть ли способ сделать мою callback функцию более похожей на generic-ish ?как после того, как я верну string, тогда его тип также будет string

1 Ответ

0 голосов
/ 28 июня 2019

Вы звоните как обратный вызов: return await callback(t, data);

Ожидается, что при использовании await callback будет возвращено Promise (вы можете только ждать обещания)

Для этого нужно настроить свою подпись:

callback: <T> (t: firestore.Transaction, data: any) => Promise<T>

При использовании функции async он автоматически будет заключен в обещание.

Так что вы должны называть это так:

await validateViaTransaction(id, null, async (t: firestore.Transaction) => {
 t.set(new data here...., {merge: true});

 return "Validation Successful";
})

при асинхронном обратном вызове теперь будет возвращаться Promise<string>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...