【发布时间】:2021-05-27 12:18:21
【问题描述】:
我正试图解决一个关于mapped tuple 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 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)[]
实际上,我认为如果不执行以下操作就没有办法做到这一点:
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]
但就我而言,我更喜欢传入数组而不是可变参数
【问题讨论】: