Введите параметр `U` вызова метода` then`. Отсутствует аннотация

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

type PromiseAction = {
  +type: string,
  promise: ?Promise<any>,
};

Аргумент action для функции объявлен как тип PromiseAction:

(action: PromiseAction) =>

Позже я проверяю, имеет ли полученный объект action свойство promise, и если action.promise имеет then:

if (action.promise && typeof action.promise.then === 'function') {

Если это произойдет, я привяжусь к цепочке обещаний:

return promise.then(

В какой момент я получаю ошибку: "введите параметр U вызова метода then. Отсутствует аннотация"

Я вижу в источнике источник потока, что свойство then для promise имеет параметр U, который, я предположим, это тот, которого просят.

Как можно предоставить аннотацию U, если в объявлении типа есть только один параметр Promise<+R>?

Ответ 1

Вам не нужно определять значение U.

Источник потока, с которым вы связаны, означает, по существу, Promises, возвращаемый then, со значением, которое совпадает с возвращаемым значением обработчиков или выполненным значением возвращенного обещания этих обработчиков ". Это звучит запутанно (потому что Promises может быть очень запутанным), но суть в том, что это не то, что вы" заполняете". Он создает связь между типами, возвращаемыми then, и типами возвращаемых значений onFulfill и onReject, переданных в then.

Ошибка, которую вы получаете, означает, что Flow не может понять, что это за отношения, потому что у него недостаточно информации. Аннотировать обратные вызовы then с типами:

return promise.then((a:string)=>...)

Это либо исправит ошибку, либо, по крайней мере, устранит несогласованность U, чтобы дать вам более конкретную ошибку.