Typescript 带有类型推断的映射元组类型的问题

Typescript 带有类型推断的映射元组类型的问题,typescript,mapped-types,Typescript,Mapped Types,我正试着把我的头脑集中在一个关于你的问题上。 当我显式定义要映射的类型时,它们似乎可以工作,但当通过泛型推断要映射的类型时,类型系统似乎无法正常工作 class Boxed<T> { constructor(private arg: T){ } } type MapToRaw<T> = { [K in keyof T]: T[K] extends Boxed<infer E> ? E : never }; // WORKS AS EXPECTED let

我正试着把我的头脑集中在一个关于你的问题上。 当我显式定义要映射的类型时,它们似乎可以工作,但当通过泛型推断要映射的类型时,类型系统似乎无法正常工作

class Boxed<T> {
  constructor(private arg: T){ }
}
type MapToRaw<T> = { [K in keyof T]: T[K] extends Boxed<infer E> ? E : never };

// WORKS AS EXPECTED
let val: MapToRaw<[Boxed<number>, Boxed<string>]>;
// 'val' is of type [number, string]

// DOESN'T WORK AS EXPECTED
let fn = <X extends Boxed<any>[]>(arg: X) => null as any as MapToRaw<X>;
let res = fn([new Boxed(0), new Boxed('')]);
// 'res' is of type (string | number)[]
类装箱{
构造函数(私有参数:T){}
}
类型MapToRaw={[K in keyof T]:T[K]扩展装箱?E:never};
//工作如期进行
让瓦尔:马普托罗;
//“val”的类型为[number,string]
//没有按预期工作
设fn=(arg:X)=>与MapToRaw一样为null;
设res=fn([新装箱(0),新装箱(''));
//“res”的类型为(字符串|编号)[]
事实上,我认为如果不采取以下措施,就没有办法做到这一点:

let fn = <X extends Boxed<any>[]>(...arg: X) => null as any as MapToRaw<X>;
let res = fn(new Boxed(0), new Boxed(''));
// 'res ' is of type [number, string]
让fn=(…arg:X)=>与MapToRaw一样为null;
设res=fn(新装箱(0),新装箱(“”);
//“res”的类型为[number,string]

但在我的例子中,我更喜欢传入数组而不是可变参数

您需要提示编译器,
B
应该是元组,而不仅仅是简单数组。您可以使用类型约束
[T]|T[]

class Boxed<T> {
  constructor(private arg: T){ }
}
type MapToRaw<T> = { [K in keyof T]: T[K] extends Boxed<infer E> ? E : never };

let fn = <X extends [Boxed<any>] | Boxed<any>[]>(arg: X) => null! as MapToRaw<X>;
let res = fn([new Boxed(0), new Boxed('')]);
类装箱{
构造函数(私有参数:T){}
}
类型MapToRaw={[K in keyof T]:T[K]扩展装箱?E:never};

让fn=非常酷。谢谢你的时间。