[TypeScript] 编程实践之1: Google的TypeScript代码风格9:枚举

9 枚举

枚举类型是Number原语类型的独特子类型,具有一组关联的命名常量,这些常量定义了枚举类型的可能值。

9.1 枚举声明

枚举声明声明一个枚举类型和一个枚举对象。

EnumDeclaration:
	constopt enum BindingIdentifier { EnumBodyopt }

EnumDeclaration在包含的声明空间中引入了命名类型(枚举类型)和命名值(枚举对象)。 枚举类型是Number原语类型的独特子类型。 枚举对象是一个匿名对象类型的值,其中包含一组属性(所有枚举类型),这些属性与声明主体中为枚举类型声明的值相对应。 枚举对象的类型还包括带有数字签名[[x:number]:string’的数字索引签名。

枚举声明的BindingIdentifier可能不是预定义的类型名称之一(第3.8.1节)。

当枚举声明包含const修饰符时,它被称为常量枚举声明。 常量枚举声明的成员都必须具有可以在编译时计算的常量值。 常量枚举声明将在9.4节中讨论。

这个例子

enum Color { Red, Green, Blue }

声明Number原始类型的子类型称为“ Color”,并引入一个变量“ Color”,其类型与声明相对应

var Color: {  
    [x: number]: string;  
    Red: Color;  
    Green: Color;  
    Blue: Color;  
};

数字索引签名反映了在每个枚举对象中自动生成的“反向映射”,如第9.5节所述。 反向映射提供了一种获取枚举值的字符串表示形式的便捷方法。 例如

var c = Color.Red;  
console.log(Color[c]);  // Outputs "Red"

9.2 枚举成员

枚举声明的主体定义了零个或多个枚举成员,这些成员是枚举类型的命名值。 每个枚举成员都有一个由枚举声明引入的原始类型的关联数值。

EnumBody:
	EnumMemberList ,opt

EnumMemberList:
	EnumMember
	EnumMemberList , EnumMember

EnumMember:
	PropertyName
	PropertyName = EnumValue

EnumValue:
	AssignmentExpression

枚举成员的PropertyName不能是计算的属性名称(2.2.3)。

枚举成员可以是常量成员,也可以是计算成员。常量成员具有已知的常量值,该值将替换生成的JavaScript代码中对成员的引用。计算成员具有在运行时计算的值,而在编译时未知。不会对引用的计算成员执行替换。

枚举成员的分类如下:

  • 如果成员声明未指定任何值,则该成员被视为常量枚举成员。如果该成员是枚举声明中的第一个成员,则将其赋值为零。否则,将前一个成员的值加1,并且如果前一个成员不是常量枚举成员,则会发生错误。
  • 如果成员声明指定了可以归为常量枚举表达式(如下定义)的值,则该成员被视为常量枚举成员。
  • 否则,该成员被视为计算枚举成员。

枚举值表达式的类型必须为Any,Number基本类型或枚举类型本身。

常量枚举表达式是表达式语法的子集,可以在编译时对其进行全面评估。如果表达式是下列之一,则将其视为常量枚举表达式:

  • 数字文字。
  • 表示同一常量枚举声明中先前声明的成员的标识符或属性访问。
  • 带括号的常量枚举表达式。
  • +,–或〜一元运算符应用于常量枚举表达式。
  • +,–,*,/,%,<<,>>,>>>,&,^或| 运算符应用于两个常量枚举表达式。

在这个例子中

enum Test {  
    A,  
    B,  
    C = Math.floor(Math.random() * 1000),  
    D = 10,  
    E  
}

“ A”,“ B”,“ D”和“ E”是常数成员,分别具有值0、1、10和11,而“ C”是计算成员。

在这个例子中

enum Style {  
    None = 0,  
    Bold = 1,  
    Italic = 2,  
    Underline = 4,  
    Emphasis = Bold | Italic,  
    Hyperlink = Bold | Underline  
}

所有成员都是常任理事国。 注意,枚举成员声明可以无条件引用其他枚举成员。 同样,由于枚举是Number原语类型的子类型,因此可以使用数字运算符(例如按位OR运算符)来计算枚举值。

9.3 声明合并

枚举是“开放式的”,并且相对于公共根具有相同限定名称的枚举声明(如第2.3节中所定义)定义单个枚举类型并构成单个枚举对象。

一个枚举声明不可能继续另一个枚举的自动编号顺序,并且当一个枚举类型具有多个声明时,只允许一个声明为第一个成员省略一个值。

合并枚举声明时,它们必须全部指定const修饰符或全部不指定const修饰符。

9.4 常量枚举声明

指定const修饰符的枚举声明是常量枚举声明。 在常量枚举声明中,所有成员都必须具有常量值,并且成员声明指定未归类为常量枚举表达式的表达式是错误的。

与常规枚举声明不同,常量枚举声明在生成的JavaScript代码中被完全擦除。 因此,在除选择枚举成员之一的属性访问之外的任何其他上下文中引用常量枚举对象都是错误的。 例如:

const enum Comparison {  
    LessThan = -1,  
    EqualTo = 0,  
    GreaterThan = 1  
}

var x = Comparison.EqualTo;  // Ok, replaced with 0 in emitted code  
var y = Comparison[Comparison.EqualTo];  // Error  
var z = Comparison;  // Error

整个const枚举声明在生成的JavaScript代码中被擦除。 因此,对枚举对象的唯一允许引用是那些被枚举成员值替换的引用。

9.5 代码生成

枚举声明生成的JavaScript等效于以下内容:

var <EnumName>;  
(function (<EnumName>) {  
    <EnumMemberAssignments>  
})(<EnumName>||(<EnumName>={}));

EnumName是枚举的名称。

EnumMemberAssignments是一系列分配,每个枚举成员按声明的顺序分配一个,形式为

<EnumName>[<EnumName>["<MemberName>"] = <Value>] = "<MemberName>";

其中MemberName是枚举成员的名称,而Value是分配的常量值或为计算值表达式生成的代码。

例如,第9.1节中的“颜色”枚举示例生成以下JavaScript:

var Color;  
(function (Color) {  
    Color[Color["Red"] = 0] = "Red";  
    Color[Color["Green"] = 1] = "Green";  
    Color[Color["Blue"] = 2] = "Blue";  
})(Color||(Color={}));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值