【问题标题】:Issue around Mapped Tuple Types with type inference带有类型推断的映射元组类型的问题
【发布时间】: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]

但就我而言,我更喜欢传入数组而不是可变参数

【问题讨论】:

    标签: typescript mapped-types


    【解决方案1】:

    您需要向编译器提示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('')]);
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 2014-08-31
      相关资源
      最近更新 更多