Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 将承诺数组转换为一个可以是包含类型之一的承诺:[P<;string>;,P<;number>;]->;承诺<;字符串|编号>;_Typescript - Fatal编程技术网

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;