Typescript Promise 链接 - 更改返回的类型

Typescript Promise chaining - changing the returned type

我有两个我想调用的异步获取,第二个使用第一个的输出,并且它们返回的类型(在 Promise 中)不同。

这些来自 React 中的 AsyncStorage 库。

我的代码是:

    function fetchAllSecretsRaw(): Promise<[string, string | null][]> {
        return AsyncStorage.getAllKeys().then((allKeys) => {
            return AsyncStorage.multiGet(allKeys.filter(isSecretKey));
        });
    }

我很惊讶在查看 Promise 声明时会进行类型检查。这是如何运作的? Promise<[string, string | null][]>如何满足Promise<string[]>(来自TResult1 = T

异步函数签名是:

getAllKeys(callback?: (error?: Error, keys?: string[]) => void): Promise<string[]>;

  multiGet(
    keys: string[],
    callback?: (errors?: Error[], result?: [string, string | null][]) => void
  ): Promise<[string, string | null][]>;

while .then 在 Promise<T> 上是:

    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
        onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;

第一个getAllKeys()给了我一个Promise<string[]>,根据Promise声明,这意味着T=string[]

因为TResult1 = T(从当时的声明then<TResult1 = T,)是否意味着TResult1 = string[]

但是我传递的 onfulfilled 函数实际上是 returns 一个 Promise<[string, string | null][]>,即元组数组而不是字符串数组。

TResult1onfulfilled 函数的 return 值的类型(在您的情况下 [string, string | null][])或者如果 onfulfilled 不存在则类型T(在你的情况下 string[])。

因为您的 onfulfilled 函数是:

(allKeys) => {
  return AsyncStorage.multiGet(allKeys.filter(isSecretKey));
}

其中 return 是 Promise<[string, string | null][]>。因此,这类型检查很好。这不是错误。

the .then declaration also constrains that TResult1 = T

不,它不限制它(就像 extends 子句那样)- 这只是没有提供 onfulfilled 回调时的默认值。

但是你确实提供了一个,它的类型是(value: string[]) => Promise<[string, string | null][]>,所以TResult1被正确地推断为[string, string | null][]