TypeScript遍历对象并根据值创建类型

保罗·苏亚雷斯

鉴于我有一个这样的对象:

const props = [
    { name: 'car', list: { brand: 'audi', model: 's4' }
    { name: 'motorcycle', list: { type: 'ktm', color: 'orange' }
] as constant;

我想创建一个代表这样的类型:

type Props = {
    car?: 'brand' | 'model',
    motorcycle?: 'type' | 'color'
};

我最接近的是这样的:

type Props = Partial<Record<typeof props[number]['name'], typeof props[number]['list']>

但是返回如下内容:

type Props = {
    car?: { brand: 'audi', model: 's4' } | { type: 'ktm' | color: 'orange' } | undefined,
    motorcycle?: { brand: 'audi', model: 's4' } | { type: 'ktm' | color: 'orange' } | undefined
}

如何获得理想的结果?

Oblosys

您可以使用TypeScript 4.1(docs)中引入的密钥重新映射来实现此目的:

type IndexKeys<T> = Exclude<keyof T, keyof []>
type ListProp = { name: string, list: object }
type GetName<P> = P extends ListProp ? P['name'] : never
type GetListKeys<P> = P extends ListProp ? keyof P['list'] : never

type PropsFromList<PropList extends ReadonlyArray<ListProp>> = {
  [i in IndexKeys<PropList> as GetName<PropList[i]>]?: GetListKeys<PropList[i]>
}

type Props = PropsFromList<typeof props>
// Inferred type:
// Props: {
//     car?: "brand" | "model" | undefined;
//     motorcycle?: "type" | "color" | undefined;
// }

请注意,就像使用时一样Partial,可选属性类型会获得额外的但无害的信息| undefined

TypeScript游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据并集/相交对象类型的值创建类型?

来自分类Dev

TypeScript根据参数数量创建类型

来自分类Dev

根据通用类型创建新对象

来自分类Dev

根据用户输入创建特定类型的对象

来自分类Dev

如何根据对象数组中特定键的值来创建单位类型?

来自分类Dev

根据键从对象创建值数组

来自分类Dev

Typescript数组对象属性值作为类型

来自分类Dev

在 Typescript 中约束对象的值类型

来自分类Dev

遍历对象的属性并获取类型为DateTime的值

来自分类Dev

遍历整个 javascript 对象并修改所有类型的值

来自分类Dev

遍历对象并添加类型

来自分类Dev

TypeScript和NestJs:只能从对象类型创建传播类型

来自分类Dev

如何遍历 2 个数组以创建新的键/值对象

来自分类Dev

映射2个对象并根据值创建对象

来自分类Dev

根据列表中对象的属性定义Typescript类型

来自分类Dev

如何根据 switch case 为 TypeScript 中的对象分配类型

来自分类Dev

TypeScript:使用对象类型中的值重新映射联合类型

来自分类Dev

如何基于现有对象值定义Typescript对象类型?

来自分类Dev

使用名称和类型属性的类型化值创建对象

来自分类Dev

如何根据TypeScript中的通用类型值添加字段?

来自分类Dev

遍历对象的值

来自分类Dev

遍历对象值

来自分类Dev

自动映射器-根据映射对象的类型设置值

来自分类Dev

根据对象类型值Vuetify v-select禁用选项

来自分类Dev

Automapper-根据映射对象的类型设置值

来自分类Dev

是否可以在TypeScript中创建通用的映射对象类型?

来自分类Dev

TypeScript中是否可以直接从对象的键创建新类型?

来自分类Dev

Angular 5 + Typescript - 返回新创建的类型对象数组

来自分类Dev

根据可变数量的数组值创建对象

Related 相关文章

  1. 1

    如何根据并集/相交对象类型的值创建类型?

  2. 2

    TypeScript根据参数数量创建类型

  3. 3

    根据通用类型创建新对象

  4. 4

    根据用户输入创建特定类型的对象

  5. 5

    如何根据对象数组中特定键的值来创建单位类型?

  6. 6

    根据键从对象创建值数组

  7. 7

    Typescript数组对象属性值作为类型

  8. 8

    在 Typescript 中约束对象的值类型

  9. 9

    遍历对象的属性并获取类型为DateTime的值

  10. 10

    遍历整个 javascript 对象并修改所有类型的值

  11. 11

    遍历对象并添加类型

  12. 12

    TypeScript和NestJs:只能从对象类型创建传播类型

  13. 13

    如何遍历 2 个数组以创建新的键/值对象

  14. 14

    映射2个对象并根据值创建对象

  15. 15

    根据列表中对象的属性定义Typescript类型

  16. 16

    如何根据 switch case 为 TypeScript 中的对象分配类型

  17. 17

    TypeScript:使用对象类型中的值重新映射联合类型

  18. 18

    如何基于现有对象值定义Typescript对象类型?

  19. 19

    使用名称和类型属性的类型化值创建对象

  20. 20

    如何根据TypeScript中的通用类型值添加字段?

  21. 21

    遍历对象的值

  22. 22

    遍历对象值

  23. 23

    自动映射器-根据映射对象的类型设置值

  24. 24

    根据对象类型值Vuetify v-select禁用选项

  25. 25

    Automapper-根据映射对象的类型设置值

  26. 26

    是否可以在TypeScript中创建通用的映射对象类型?

  27. 27

    TypeScript中是否可以直接从对象的键创建新类型?

  28. 28

    Angular 5 + Typescript - 返回新创建的类型对象数组

  29. 29

    根据可变数量的数组值创建对象

热门标签

归档