【问题标题】:TypeScript Mapped Types: Get element type of arrayTypeScript Mapped Types:获取数组的元素类型
【发布时间】:2017-12-04 12:30:05
【问题描述】:

假设有一个容器类型,其数组属性为未知/生成类型T1T2 等(简称T*):

interface MultiContainer
{
    Item1: T1[];
    Item2: T2[];
    ...
}

是否可以使用maped types 派生出以下类型:

interface SingleContainer
{
    Item1: T1;
    Item2: T2;
    ...
}

我正在寻找一些类似的表达方式:

type SingleContainer =
    { [ P in keyof MultiContainer ]: MultiContainer[P] }
                                            └─────────── returns T*[] instead of T*  

MultiContainer[P]返回类型T*[],但我需要一个返回T*的表达式

提前致谢!

【问题讨论】:

    标签: typescript mapped-types


    【解决方案1】:

    我相信这可以满足您的需求:

    type SingleContainer = {[P in keyof MultiContainer]: MultiContainer[P][0]}
    

    【讨论】:

      【解决方案2】:

      从 TS 2.8 开始可以使用 infer 关键字:

      type SingleContainer = {
        [P in keyof MultiContainer]: MultiContainer[P] extends (infer T)[] ? T : never
      };
      

      【讨论】:

      • 真是天才!这允许您构造一个Flat<T> 类型:type Flat<T> = { [P in keyof T]: T[P] extends (infer A)[] ? A : T[P]; }。用法:interface MixedContainer { Item1: T1; Item2: T2[] }; type FlatContainer = Flat<MixedContainer>; // { Item1: T1; Item2: T2 } 输入一些字符串模板,你甚至可以从{ Items: T1[] } 转到{ Item: T1 }
      猜你喜欢
      • 1970-01-01
      • 2018-07-20
      • 2021-10-24
      • 2016-12-29
      • 2011-10-25
      • 2013-10-28
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多