假设我有一个这样的对象:
const MenuOptions = {
Project: ["new", "open", "close"],
File: ["create", "edit"]
// ...
}
对象的值都是唯一的。
我还想定义一种方法,以允许用户单击菜单选项:
function clickOnMenuOption(option: string) { ... }
参数option
的值只能是new/open/close/create/edit/...
之一。
是否可以基于MenuOption
定义类型MenuOptions
?
type MenuOption = ???
答案 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() {}