如何基于TypeScript中的const对象创建对象类型?

纳尔逊·卢克

我需要定义一个基于配置对象 ( anObject) 的类型,它将在我的代码中使用。

我写了类似下面的东西,

const anObject = {
  foo: ["a", "b", "c"],
  bar: ["d", "e", "f"],
} as const;

type aType = {
  key: keyof typeof anObject | "";
  value: typeof anObject[keyof typeof anObject][number][];
} & (
  | { key: ""; value: [] }
  | { key: "foo"; value: typeof anObject["foo"][number][] }
  | { key: "bar"; value: typeof anObject["bar"][number][] }
);
// aType =
//   | { key: ""; value: [] }
//   | { key: "foo"; value: ("a" | "b" | "c")[] }
//   | { key: "bar"; value: ("d" | "e" | "f")[] };

const foo: aType = { key: "", value: [] };

但是我在上面的代码中遇到了两个问题。

  • 每次向 中添加新密钥时anObject,还需要向 中添加一行aType

  • TypeScript 无法识别中的空数组foo并报告错误
    Type 'never[]' is not assignable to type '("a" | "b" | "c" | "d" | "e" | "f")[] & []'.

aType在 TypeScript 中声明的正确方法是什么

约塞连船长

值得在这里使用 union:

const anObject = {
    foo: ["a", "b", "c"],
    bar: ["d", "e", "f"],
} as const;

type AnObject = typeof anObject;

type Values<T> = T[keyof T]

type AType = {
    [P in keyof AnObject]: {
        key: P,
        value: Array<AnObject[P][number]>
    }
}

type Default = { key: ""; value: [] }

type Result = Values<AType> | Default

const foo: Result = { key: "", value: [] }; // ok
const bar: Result = { key: "bar", value: ["d"] } // ok

随意将任何新密钥添加到anObject. 您无需在其他任何地方进行更新

请记住,正如@TJ Crowder 所说,value物业没有订单TS 将允许不同的值组合:[d,e] | [e, d] | [d].

如果你想要它的顺序相同,只需使用这一行:value: AnObject[P]in ATypehelper

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从 TypeScript 中的对象数组创建类型?

如何基于数组中对象的属性创建类型?

如何在TypeScript中基于只读元组动态创建对象?

如何基于TypeScript中的接口文件定义创建对象?

如何基于超类型的对象创建子类型的对象?

如何基于对象值创建窄类型

在 TypeScript 中创建 const 对象的问题

如何从Typescript中的固定对象的键创建映射类型

如何在TypeScript中声明通过for await创建的对象的类型

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

如何使用基于对象值的键创建对象类型

根据Typescript中的对象数组创建对象类型

根据Typescript中多个对象的同名属性创建对象类型?

如何基于对象中的值限制对象类型?

在列表中,可以基于Typescript中的对象属性获取对象的对象类型。

如何基于TypeScript中的其他类型使对象属性为可选?

在 TypeScript 中,如何指定对象中值的类型?

TypeScript从通用类型创建对象

如何基于类型化对象数组中的值限制类型?

TypeScript:如何从元组数组中创建对象?

如何基于对象属性创建新对象

如何使用受约束的泛型值类型在 TypeScript 中创建对象?

如何在 TypeScript 中创建具有类型别名的对象?

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

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

TypeScript - 基于类型对象在函数 sig 中映射键类型与值类型

如何基于 R 中的两列创建虚拟对象

如何基于循环在C#中创建(n)个对象

TypeScript中的对象类型转换