TypeScript映射类型:获取数组元素类型

5
假设有一个容器类型,其包含未知/生成类型 T1、T2 等数组属性(简称 T*):
interface MultiContainer
{
    Item1: T1[];
    Item2: T2[];
    ...
}

使用映射类型是否可以推导出以下类型:

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

我正在寻找一些类似于以下表达式:

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

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

提前致谢!

2个回答

4
我相信这可以满足你的需求:
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
};

1
相当精妙!这使您能够构建一个 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 } - wensveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接