Typescript 将承诺数组转换为一个可以是包含类型之一的承诺:[P<;string>;,P<;number>;]->;承诺<;字符串|编号>;
我试图创建一个函数,该函数将从一系列承诺中返回第一个已确定的值Typescript 将承诺数组转换为一个可以是包含类型之一的承诺:[P<;string>;,P<;number>;]->;承诺<;字符串|编号>;,typescript,Typescript,我试图创建一个函数,该函数将从一系列承诺中返回第一个已确定的值 const firstSettledValue=(…承诺:数组):承诺{ // ... } 常数v=第一个已结算值( 新承诺(), 新承诺(), 新承诺 ) 承诺 您只需使用: const v=Promise.race([ 新承诺(()=>{}), 新承诺(()=>{}), 新承诺(()=>{}) ]); 承诺 返回类型推断正确。使用一个我们可以使用TypeScript精确地处理这个问题 这允许使用声明通用元组类型,该类型在调用函
const firstSettledValue=(…承诺:数组):承诺{
// ...
}
常数v=第一个已结算值(
新承诺(),
新承诺(),
新承诺
)
承诺
您只需使用:
const v=Promise.race([
新承诺(()=>{}),
新承诺(()=>{}),
新承诺(()=>{})
]);
承诺
返回类型推断正确。使用一个我们可以使用TypeScript精确地处理这个问题 这允许使用声明通用元组类型,该类型在调用函数时捕获每个参数的单个类型 让我们把它分解一下 首先,我们将捕获传递给函数的每个参数的类型
const firstSettledValue = <P extends Promise<any>[]>(...promises: P) => {}
const v = firstSettledValue(
Promise.resolve('Hello World'),
Promise.resolve(15),
Promise.resolve(false)
)
注意,在上面的p[0]
是类型string
,p[1]
是类型number
,依此类推
但是,我们不能在上面的代码中直接使用p[Number]
,因为我们的元素是承诺,我们需要提取它们的值类型
为此,我们可以引入一个小助手类型
type ValueType<T> = T extends Promise<infer U>
? U
: T;
我们完成了
v
具有类型Promise
,基于调用中指定的承诺。精彩的解释。非常感谢
type U = P[number] // string | number | boolean
type ValueType<T> = T extends Promise<infer U>
? U
: T;
const firstSettledValue = <P extends Promise<any>[]>(...promises: P): Promise<ValueType<P[number]>> => {
const randomIndex = Math.floor(Math.random() * 100) % promises.length;
return promises[randomIndex];
};
const v = firstSettledValue(
Promise.resolve('Hello World'),
Promise.resolve(15),
Promise.resolve(false)
);
type ValueType<T> = T extends Promise<infer U>
? U
: T;