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][]>
,即元组数组而不是字符串数组。
TResult1
是 onfulfilled
函数的 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][]
。
我有两个我想调用的异步获取,第二个使用第一个的输出,并且它们返回的类型(在 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][]>
,即元组数组而不是字符串数组。
TResult1
是 onfulfilled
函数的 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 thatTResult1 = T
不,它不限制它(就像 extends
子句那样)- 这只是没有提供 onfulfilled
回调时的默认值。
但是你确实提供了一个,它的类型是(value: string[]) => Promise<[string, string | null][]>
,所以TResult1
被正确地推断为[string, string | null][]
。