创建使用对象的值构造的类型

时间:2019-02-09 15:13:06

标签: typescript typescript-typings

假设我有一个这样的对象:

const MenuOptions = {
    Project: ["new", "open", "close"],
    File: ["create", "edit"]
    // ...
}

对象的值都是唯一的。

我还想定义一种方法,以允许用户单击菜单选项:

function clickOnMenuOption(option: string) { ... }

参数option的值只能是new/open/close/create/edit/...之一。

是否可以基于MenuOption定义类型MenuOptions

type MenuOption = ???

3 个答案:

答案 0 :(得分:1)

如果仅按上述声明MenuOptions,则编译器将倾向于将值类型推断为string[]而不是文字元组。如果您需要访问这些文字,则需要更改声明对象的方式。当TypeScript 3.4于2019年3月发布时,您将可以使用const context来提示编译器推断出尽可能窄的类型,如下所示:

const MenuOptions = {
  Project: ["new", "open", "close"],
  File: ["create", "edit"]
  // ...
} as const; // only works in TS3.4+

在此之前,您可以使用如下帮助程序功能来指导推理:

type Narrowable = string | number | boolean | undefined | null | void | {};   
const tuple = <T extends Narrowable[]>(...t: T)=> t;    

const MenuOptions = {
  Project: tuple("new", "open", "close"),
  File: tuple("create", "edit")
  // ...
};

无论哪种情况,您想要的类型都在上面给出

type MenuOption = (typeof MenuOptions)[keyof typeof MenuOptions][number];

我们将其分解为多个步骤,并为中间类型命名。您使用的是MenuOptions类型:

type TypeofMenuOptions = typeof MenuOptions;
// type TypeofMenuOptions = {
//   Project: ["new", "open", "close"];
//   File: ["create", "edit"];
// }

查找其值类型的并集

type MenuOptionsValues = TypeofMenuOptions[keyof TypeofMenuOptions];
// type MenuOptionsValues = ["new", "open", "close"] | ["create", "edit"]

并查找其数字索引属性(如果类型为(A | B)[K],则其值为A[K] | B[K]

type MenuOption = MenuOptionsValues[number];
// type MenuOption = "new" | "open" | "close" | "create" | "edit"

剩下的就是您要查找的字符串文字的并集。

好的,希望能有所帮助。祝你好运!

答案 1 :(得分:0)

您可以使用TypeScript Enums。它们最适合于声明常量。

enum MenuOption {
    New = "new",
    Open = "open",
    Close = "close",
    Create = "create",
    Edit = "edit"
}
const MenuOptions = {
    Project: [MenuOption.New, MenuOption.Open, MenuOption.Close],
    File: [MenuOption.Create, MenuOption.Edit]
}
function clickOnMenuOption(option: MenuOption) { //... }

答案 2 :(得分:0)

我不知道您使用TS的经验是什么,但是您似乎犯了典型的TS新手错误(将值与类型混淆),如果我错了,抱歉。

惯用的TS代码应如下所示:

Foo::Foo() {}