如何在 TypeScript 中创建类似枚举的类型?
-
12-12-2019 - |
题
我正在为 TypeScript 的 Google 地图 API 编写定义文件。
我需要定义一个类似枚举的类型,例如。 google.maps.Animation
其中包含两个属性: BOUNCE
和 DROP
.
在 TypeScript 中应该如何完成?
解决方案
TypeScript 0.9+ 有枚举规范:
enum AnimationType {
BOUNCE,
DROP,
}
最后的逗号是可选的。
其他提示
从 TypeScript 0.9(当前是 alpha 版本)开始,您可以像这样使用枚举定义:
enum TShirtSize {
Small,
Medium,
Large
}
var mySize = TShirtSize.Large;
默认情况下,这些枚举将分别分配为 0、1 和 2。如果您想显式设置这些数字,可以将其作为枚举声明的一部分。
清单 6.2 具有显式成员的枚举
enum TShirtSize {
Small = 3,
Medium = 5,
Large = 8
}
var mySize = TShirtSize.Large;
这两个例子都直接来自 适用于 JavaScript 程序员的 TypeScript.
请注意,这与 0.8 规范不同。 0.8 规范看起来像这样 - 但它被标记为实验性的并且可能会更改,因此您必须更新所有旧代码:
免责声明 - 这个 0.8 示例在较新版本的 TypeScript 编译器中会被破坏。
enum TShirtSize {
Small: 3,
Medium: 5,
Large: 8
}
var mySize = TShirtSize.Large;
现在这是语言的一部分。看 TypeScriptLang.org > 基本类型 > 枚举 有关于此的文档。有关如何使用这些枚举的文档摘录:
enum Color {Red, Green, Blue};
var c: Color = Color.Green;
或者使用手动支持号码:
enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;
您还可以使用例如返回枚举名称 Color[2]
.
以下是这一切如何结合在一起的示例:
module myModule {
export enum Color {Red, Green, Blue};
export class MyClass {
myColor: Color;
constructor() {
console.log(this.myColor);
this.myColor = Color.Blue;
console.log(this.myColor);
console.log(Color[this.myColor]);
}
}
}
var foo = new myModule.MyClass();
这将记录:
undefined 2 Blue
因为,在撰写本文时,Typescript Playground 将生成以下代码:
var myModule;
(function (myModule) {
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(myModule.Color || (myModule.Color = {}));
var Color = myModule.Color;
;
var MyClass = (function () {
function MyClass() {
console.log(this.myColor);
this.myColor = Color.Blue;
console.log(this.myColor);
console.log(Color[this.myColor]);
}
return MyClass;
})();
myModule.MyClass = MyClass;
})(myModule || (myModule = {}));
var foo = new myModule.MyClass();
另请注意,您可以使用以下内容进行 id/string 枚举:
class EnumyObjects{
public static BOUNCE={str:"Bounce",id:1};
public static DROP={str:"Drop",id:2};
public static FALL={str:"Fall",id:3};
}
更新:
正如@iX3 所指出的, 打字稿 2.4 支持枚举字符串。
原答案:
对于 String 成员值,TypeScript 仅允许数字作为枚举成员值。但是您可以实施一些解决方案/技巧;
解决方案一:
复制自: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
有一个简单的解决方案:只需在分配之前将字符串文字转换为任何:
export enum Language {
English = <any>"English",
German = <any>"German",
French = <any>"French",
Italian = <any>"Italian"
}
解决方案2:
复制自: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html
您可以使用字符串文字作为类型。例如:
let foo: 'Hello';
这里我们创建了一个名为 foo 的变量,它只允许将文字值“Hello”分配给它。下面演示了这一点:
let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"
它们本身并不是很有用,但可以组合在类型联合中以创建强大(且有用)的抽象,例如:
type CardinalDirection =
"North"
| "East"
| "South"
| "West";
function move(distance: number, direction: CardinalDirection) {
// ...
}
move(1,"North"); // Okay
move(1,"Nurth"); // Error!
打字稿中的枚举:
枚举被放入打字稿语言中来定义一组命名常量。使用枚举可以让我们的生活更轻松。原因是这些常量通常比枚举表示的值更容易阅读。
创建一个枚举:
enum Direction {
Up = 1,
Down,
Left,
Right,
}
打字稿文档中的这个示例很好地解释了枚举的工作原理。请注意,我们的第一个枚举值 (Up) 初始化为 1。那么数字枚举的所有以下成员都是 自动递增 从这个值(即下= 2,左= 3,右= 4)。如果我们没有用 1 初始化第一个值,枚举将从 0 开始,然后自动递增(即下= 1,左= 2,右= 3)。
使用枚举:
我们可以通过以下方式访问枚举的值:
Direction.Up; // first the enum name, then the dot operator followed by the enum value
Direction.Down;
请注意,这样我们就多了 描述性的 以我们编写代码的方式。枚举基本上阻止我们使用 神奇的数字 (数字代表某个实体,因为程序员在特定上下文中赋予了它们含义)。幻数不好的原因如下:
- 我们需要更努力地思考,我们首先需要将数字转换为实体,然后才能推理我们的代码。
- 如果我们在一段时间后查看我们的代码,或者其他程序员查看我们的代码,他们不一定知道这些数字的含义。