TypeScript进阶篇 --- 枚举

枚举

枚举(Enum)类型用来取值被限定在一定范围内的场景,比如一周只能偶七天,颜色限定为红绿蓝等。

简单的例子

枚举使用enum关键字来定义:

    enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
    console.log(Days["Sun"] === 0); // true
    console.log(Days["Mon"] === 1); // true
    console.log(Days["Tue"] === 2); // true
    console.log(Days["Sat"] === 6); // true

    console.log(Days[0] === "Sun"); // true
    console.log(Days[1] === "Mon"); // true
    console.log(Days[2] === "Tue"); // true
    console.log(Days[6] === "Sat"); // true

枚举成员会被赋值从0开始递增的数字,同时也会对枚举值到枚举名进行反向映射。
编译结果:

    var Days = void 0;
    (function (Days) {
        Days[Days["Sun"] = 0] = "Sun";
        Days[Days["Mon"] = 1] = "Mon";
        Days[Days["Tue"] = 2] = "Tue";
        Days[Days["Wed"] = 3] = "Wed";
        Days[Days["Thu"] = 4] = "Thu";
        Days[Days["Fri"] = 5] = "Fri";
        Days[Days["Sat"] = 6] = "Sat";
    })(Days || (Days = {}));
手动赋值

我们也可以给枚举项手动赋值:

    enum Days { Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat };

上例子中,未手动赋值的枚举项会接着上一个枚举项递增。
编译结果:

 (function (Days) {
        Days[Days["Sun"] = 7] = "Sun";
        Days[Days["Mon"] = 1] = "Mon";
        Days[Days["Tue"] = 2] = "Tue";
        Days[Days["Wed"] = 3] = "Wed";
        Days[Days["Thu"] = 4] = "Thu";
        Days[Days["Fri"] = 5] = "Fri";
        Days[Days["Sat"] = 6] = "Sat";
    })(Days || (Days = {}));

如果未手动赋值的枚举项和手动赋值的重复了, TypeScript是不会察觉到这一点的:

    enum Days { Sun = 3, Mon = 1, Tue, Wed, Thu, Fri, Sat };

编译结果:

  var Days = void 0;
    (function (Days) {
        Days[Days["Sun"] = 3] = "Sun";
        Days[Days["Mon"] = 1] = "Mon";
        Days[Days["Tue"] = 2] = "Tue";
        Days[Days["Wed"] = 3] = "Wed";
        Days[Days["Thu"] = 4] = "Thu";
        Days[Days["Fri"] = 5] = "Fri";
        Days[Days["Sat"] = 6] = "Sat";
    })(Days || (Days = {}));

上例子中,递增到3的时候与前面的Sun取值重复了,但是 TypeScript 并没有报错,导致Days[3]的值显示Sun,而后又被Wed覆盖了。
所以使用的时候需要注意,最好不要出现这种覆盖的情况。
手动赋值的枚举项也可以不是数字,此时需要使用类型断言来让tsc无视类型检查。

    enum Days { Sun = 3, Mon = 1, Tue, Wed, Thu, Fri, Sat = <any> "s" };

编译结果:

    var Days = void 0;
    (function (Days) {
        Days[Days["Sun"] = 3] = "Sun";
        Days[Days["Mon"] = 1] = "Mon";
        Days[Days["Tue"] = 2] = "Tue";
        Days[Days["Wed"] = 3] = "Wed";
        Days[Days["Thu"] = 4] = "Thu";
        Days[Days["Fri"] = 5] = "Fri";
        Days[Days["Sat"] = "s"] = "Sat";
    })(Days || (Days = {}));

这种后续的枚举类型必须是手动赋值的:

    enum Days { Sun = 3, Mon = 1, Tue, Wed, Thu = <any> "T", Fri, Sat}; //Fri, Sa 枚举成员必须具有初始化表达式。

当然手动赋值的枚举项也可以为小数或负数,此时后续未手动赋值的项递增的步长仍为1:

 enum Days { Sun = 3, Mon = 1.2, Tue, Wed, Thu, Fri, Sat };

编译结果:

    var Days = void 0;
    (function (Days) {
        Days[Days["Sun"] = 3] = "Sun";
        Days[Days["Mon"] = 1.2] = "Mon";
        Days[Days["Tue"] = 2.2] = "Tue";
        Days[Days["Wed"] = 3.2] = "Wed";
        Days[Days["Thu"] = 4.2] = "Thu";
        Days[Days["Fri"] = 5.2] = "Fri";
        Days[Days["Sat"] = 6.2] = "Sat";
    })(Days || (Days = {}));
常数项和计算所得项

枚举项有两种类型:常数项(constant member)和计算所得项(computed member)。
前面我们所举的例子都是常数项,下面是一个计算所得项的例子:

    enum Colors { Red , Green ,Blue = 'blue'.length }

上面例子中,'blue'.length就是一个计算所得项。
上面例子不会报错,但是如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错。
常数项和计算所得项的完整定义:
当满足以下条件的时候,枚举成员被当做是常数:

  • 不具有初始化函数并且之前的枚举成员是常数。在这种情况下,当前枚举成员的值为上一个枚举成员的值加1,但第一个枚举元素列外。如果他没有初始化方法,那么他的初始化值为0
  • 枚举成员使用常数枚举表达式初始化。常数枚举的表达式 TypeScript表达式的子集,他可以在编译阶段求职。当一个表达满足下面条件之一时,他就是一个常数枚举表达式:
    • 数字字面量
    • 引用之前定义的常数枚举成员(可以是在不同的枚举类型中定义的),如果这个成员是在同一个枚举类型中订购一的,可以使用非限定名来引用。
    • 带括号的常数枚举表达式
    • +-~一元运算符应用于常数枚举表达式
    • +-*/%<<>>>>>&|^二元运算符,常数枚举表达式作为其一个操作对象。若常数枚举表达式求值后为NaN或Infinity,则会在编译阶段报错。

所有其他情况的没救成员被当做是需要计算得出的值。

常数枚举

常数枚举是使用const enum定义的枚举类型:

    const enum Directives{
        Up,
        Down,
        Left,
        Right
    }

    let directives = [Directives.Up,Directives.Down,Directives.Left,Directives.Right]

常数枚举与普通枚举的区别是,他会在编译阶段被删除,并且不能包好计算成员。
编译结果:

    var directives = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

假如包含了计算成员,则会在编译阶段报错。

外部枚举

外部枚举(Ambient Enums)是使用declare enum定义的枚举类型:

    declare enum Directives{
        Up,
        Down,
        Left,
        Right
    }
    let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

之前提到过,declare定义的类型指挥用于编译时的检查,编译结果中会被删除。
上面的编译结果:

    var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

外部枚举与声明语句一样,常出现在声明文件中。
同时使用declareconst也是可以的:

    declare const enum Directions {
        Up,
        Down,
        Left,
        Right
    }

    let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

编译结果:

    var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue-typescript-import-dts 是一个用于为 Vue.js 项目中的 TypeScript 文件生成类型声明文件的工具。在 Vue.js 项目中使用 TypeScript 进行开发时,我们经常需要为一些第三方库或自定义组件编写类型声明文件,以提供更好的代码提示和类型检查。 使用 vue-typescript-import-dts 工具可以自动分析 TypeScript 文件中的导入语句,并根据导入的模块生成对应的类型声明文件。这样,在使用该模块时,IDE 或编辑器就能提供准确的代码补全和类型检查。 例如,假设我们的项目中使用了一个名为 axios 的第三方库进行网络请求,但是该库并没有提供类型声明文件。我们可以通过 vue-typescript-import-dts 工具,在我们的 TypeScript 文件中导入 axios,并正确配置工具,它将自动为我们生成一个 axios.d.ts 类型声明文件。 具体使用 vue-typescript-import-dts 的步骤如下: 1. 在项目中安装 vue-typescript-import-dts,可以使用 npm 或 yarn 命令来安装。 2. 在 TypeScript 文件中,使用 import 语句导入需要生成类型声明文件的模块。 3. 在项目根目录下创建一个 .vue-typescript-import-dts.json 配置文件,用来配置生成类型声明文件的规则。可以指定生成的声明文件的输出路径、文件名等。 4. 运行 vue-typescript-import-dts 命令,它会自动扫描 TypeScript 文件中的导入语句,并根据配置生成相应的类型声明文件。 这样,在我们编写代码时,IDE 或编辑器就可以准确地为我们提供代码补全和类型检查的功能。这对于提高开发效率和代码质量非常有帮助。 总之,vue-typescript-import-dts 是一个便捷的工具,可以自动为 Vue.js 项目中使用的第三方库或自定义组件生成类型声明文件,提供更好的代码提示和类型检查功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值