Typescript 如何将返回类型映射到元组中?

Typescript 如何将返回类型映射到元组中?,typescript,Typescript,我有一个实例数组,其中execute返回一个类型,下面是示例2 classe,其实例位于数组中: class ClassBase<TReturn> { execute (): TReturn } class ReturnsString extends ClassBase<string> { execute () : string } class ReturnsNumber extends ClassBase<number> { execu

我有一个实例数组,其中execute返回一个类型,下面是示例2 classe,其实例位于数组中:

class ClassBase<TReturn>
{
   execute (): TReturn
}

class ReturnsString extends ClassBase<string>
{
   execute () : string
}

class ReturnsNumber extends ClassBase<number>
{
   execute () : number
}

const items:[ReturnsString,ReturnsNumber] = [new ReturnsString(), new ReturnsNumber()];
在一个方法中,我将为元组中的每个项在循环中调用execute

如何声明一个

接受项目-项目可以是任意长度,也可以包含各种类型,例如可以是[ReturnString]或[ReturnString,ReturnString,ReturnString,ReturnNumber,…]

返回返回类型元组的类型[字符串,字符串,字符串,数字]


可以使用映射类型映射元组,并提取每个元组项的返回类型:

type ReturnsOfClassBase<T extends Record<number, ClassBase<any>>> = {
  -readonly [P in keyof T] : T[P] extends ClassBase<infer R> ? R: never
}
function getReturns<T extends readonly ClassBase<any>[]>(p: T): ReturnsOfClassBase<T> {
  const result = []
  for(let r of p) {
    result.push(r.execute());
  }

  return result as any
}

let r = getReturns(items)


问得好!它让我思考了很多,并使用了许多高级TS打字功能,但我想这就是您想要的:

abstract class ClassBase<TReturn = any>
{
   abstract execute (): TReturn
}

type FlattenIfArray<T> = T extends (infer R)[] ? R : T
type ExtendsOf<T> = T extends ClassBase<infer R> ? R : T
type ExecuteArrayReturn<T> = ExtendsOf<FlattenIfArray<T>>

function example<T extends ClassBase<ExecuteArrayReturn<T>>[]>(items: T): ExecuteArrayReturn<T> {
    return items.map(item => item.execute()) as any
}

class ReturnsString extends ClassBase<string>
{
   execute () : string {return 'a'}
}

class ReturnsNumber extends ClassBase<number>
{
   execute () : number {return 1}
}

const items:[ReturnsString,ReturnsNumber] = [new ReturnsString(), new ReturnsNumber()];

const result = example(items);
我需要创建一些类型来从ClassBase继承者的实例中提取执行函数返回值。FlatteiArray获取数组项的类型,ExtendsOf获取已设置为T的泛型类型,ExecuteArrayReturn将两者连接起来


当您实现真正的函数时,不要忘记函数返回中的as any。否则,TS会认为您希望返回所提供的项目类型union的数组,例如:string | number[]。

但此解决方案返回union类型的数组。该请求是显式的一个元组。这是可以做到的,看我的回答: