Typescript 如何接受泛型元组作为参数并返回包含泛型类型的genaric

Typescript 如何接受泛型元组作为参数并返回包含泛型类型的genaric,typescript,Typescript,既然TypeScript4已经发布了,我希望这会更容易,但我仍然没有找到一种方法来实现这一点 我试图创建一个函数,该函数接受包含特定泛型的元组,并返回包含值的泛型返回 interface STORE<T> { data: T; } const merge = <U extends any, T extends readonly STORE<U>[]>(values: T): STORE<U[]> => values.reduce&l

既然TypeScript4已经发布了,我希望这会更容易,但我仍然没有找到一种方法来实现这一点

我试图创建一个函数,该函数接受包含特定泛型的元组,并返回包含值的泛型返回

interface STORE<T> {
  data: T;
}

const merge = <U extends any, T extends readonly STORE<U>[]>(values: T): STORE<U[]> =>
  values.reduce<STORE<U[]>>(
    (acc, item) => {
      return { data: [...acc.data, item.data] };
    },
    { data: [] },
  );
但是,这将返回值作为存储,而不是从输入中维护类型。

请参见

通过使用
T&(T的约束)
可以解决您的问题:

const merge = <U extends any, T extends readonly STORE<U>[]>(
  values: T & readonly STORE<U>[],
         // ^ here to ---- here ^
): STORE<U[]> => values.reduce<STORE<U[]>>((acc, item) => {
    return {data: [...acc.data, item.data]};  
  }, {data: []})


interface STORE<T> {
  data: T;
}
const merge=(
值:T只读存储[],
//从这里到这里^
):STORE=>value.reduce((acc,item)=>{
返回{data:[…acc.data,item.data]};
},{数据:[]})
接口存储{
资料:T;
}

请在TS PlayGround中发布完整的示例,但不包括至少包含
TYPEONE
TYPETWO
的玩具定义。很难回答这个问题。正确答案可能是在函数中只使用一个类型参数,但如果没有一个可复制的例子,我无法验证任何东西。@yossarian上尉,我已经更新了问题,并提供了example@jcalz我已经更新了要提供的问题和示例我认为这些答案可能会对您有所帮助:1)2)这不适用于上面的示例我只是得到
类型“number”不适用可分配给数组中第二个条目上的类型“string”.ts(2322)
const merge = <U extends any, T extends readonly STORE<U>[]>(
  values: T & readonly STORE<U>[],
         // ^ here to ---- here ^
): STORE<U[]> => values.reduce<STORE<U[]>>((acc, item) => {
    return {data: [...acc.data, item.data]};  
  }, {data: []})


interface STORE<T> {
  data: T;
}