TypeScript入门-枚举、类型推论

枚举

使用枚举可以定义一些具有名字的数字常量,和在C语言中一样都是使用关键字enum

enum Direction {
    Up = 1,
    Down = 1<<2,
    Left,
    Right
}

注意:一个枚举类型可以有多个枚举成员,每个枚举成员都有一个对应的数字值,这个数字值可以是常数或者是计算得出的值。当满足下列条件时,枚举成员的数字值被认为是常数

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

例如:

enum Direction {
    //常数
    Up, //0
    Down = 3, //3
    Left = Down + 4, //7
    Right, //8

    //计算的值
    center = [1,2,3,4].length //4
}

注意:在枚举类型中每个枚举成员对应的数字值必须是唯一的,不能重复。如果有重复,则会取最后一个

enum Direction {
    //常数
    Up, //0
    Down = 3, //3
    Left = Down + 4, //7
    Right, //8

    //计算的值
    center = [1,2,3].length //3
}

console.log(Direction.Down); //3
console.log(Direction[3]); //center

枚举类型中是包含双向映射的,即(value -> name)和(name -> value)

console.log(Direction.Down); //3
console.log(Direction[3]); //Down

常数枚举

当访问枚举值时,为了避免生成多余的代码和间接引用,可以使用常数枚举。 常数枚举是在enum关键字前使用const修饰符。

常数枚举只能使用常数枚举表达式并且不同于常规的枚举的是它们在编译阶段会被删除。 常数枚举成员在使用的地方被内联进来。 这是因为常数枚举不可能有计算成员。

const enum Direction {
    //常数
    Up, //0
    Down = 3, //3
    Left = Down + 4, //7
    Right, //8

    //计算的值
    center = [1,2,3,4].length //error
}

类型推论

TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型

let x = ‘qwe‘;

变量x的类型被推断为string。 这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时

最佳通用类型

有时需要从多个类型中推断,这时会根据这些类型推断出一个最合适的通用类型

let x = [0, 1, null];

为了推断x的类型,我们必须考虑所有元素的类型。 这里有两种选择: numbernull。 计算通用类型算法会考虑所有的候选类型,并给出一个兼容所有候选类型的类型

但是有时没有一个类型能够作为所有候选类型的类型,如果没有找到最佳通用类型的话,类型推论的结果是空对象类型,{}。 因为这个类型没有任何成员,所以访问其成员的时候会报错。

一般要明确的指出类型

上下文类型

TypeScript类型推论也可能按照相反的方向进行。 这被叫做“按上下文归类”。按上下文归类会发生在表达式的类型与所处的位置相关时。

上下文归类会在很多情况下使用到。 通常包含函数的参数,赋值表达式的右边,类型断言,对象成员和数组字面量和返回值语句

window.onmousedown = function(mouseEvent) {
    console.log(mouseEvent.buton);  //error
};

之所以会报错,是因为类型检查器会根据赋值号=右边来推断参数mouseEvent的类型

如果上下文类型表达式包含了明确的类型信息,上下文的类型被忽略。 重写上面的例子:

window.onmousedown = function(mouseEvent: any) {
    console.log(mouseEvent.buton);
};

这个函数表达式有明确的参数类型注解,上下文类型被忽略。 这样的话就不报错了,因为这里不会使用到上下文类型

参考资料:

TypeScript中文网 · TypeScript——JavaScript的超集

时间: 2024-10-16 02:27:06

TypeScript入门-枚举、类型推论的相关文章

TS学习随笔(二)-&gt;类型推论,联合类型

这篇内容指南:        -----类型推论  -----联合类型 类型推论 第一篇中我们看了TS的基本使用和基本数据类型的使用,知道了变量在使用的时候都得加一个类型,那我们可不可以不加呢,这个嘛,可以也不可以,为啥这木说呢,各位看官我们上眼瞧一下. 首先我们要来先了解一个概念,类型推论:如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型 例子一: let myFavoriteNumber = 'seven'; myFavo

typeScript-基础知识-4-3类型推论

类型推论: 如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型. 什么是类型推论 以下代码虽然没有指定类型,但是会在编译的时候报错: let myFavoriteNumber = 'seven'; myFavoriteNumber = 7; // index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'. 事实上,它等价于: let

TypeScript入门 - 类型定义、函数、枚举、接口

可定义的类型 undefined : undefined: number : 数值类型: string : 字符串类型: boolean : 布尔类型: enum :枚举类型: any : 任意类型: void :空类型: Array : 数组类型: Date : 日期: RegExp : 正则: null :空类型: 类型定义 1.单类型定义 let str:string = 'hello' 2.多类型定义 let money:string|number = '100' //或 let mon

C# for Unity快速入门(连载14)_C#枚举类型

C# for Unity编程语言快速入门教程(连载14)_C#枚举类型 C#的枚举类型(用 "enum"关键字标识),按照笔者理解本质上是一个隐式继承了System.Enum的整形类.枚举类型的主要作用是:为了更好的识别一个变量的具体含义,且固定变量的使用"范围". 例如:形如如下定义 public enum Week{   Monday,  Tuesday,  Wenesday,  Thursday,  Friday,  Saterday,  Sunday }  

TypeScript入门七:TypeScript的枚举

关于枚举 数字枚举 字符串枚举 异构枚举 计算的和常量成员 运行时的枚举与反向映射 常量枚举与外部枚举 一.关于枚举 枚举:一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数. 在定义中可以看到这些关键词:有穷序列集.成员.类型对象.计数. 在这些关键字中可以了解到枚举是一组有穷数据的集合:这些数据或者类型对象被当成这个集合的成员:计数的话我的理解有两种:前面提到有序集那么就可以使用有序的数字对数据进行标识,而前面提到的有穷就说明这些数据量是可以被计算的. 根据这些定

TypeScript入门二:基本数据类型

浅析基本数据类型 TypeScript类型解析 一.浅析基本数据类型 首先有一个问题TypeScript是一门编译型语言?还是解释性语言?显然已经不能被这两个分类来区分,TypeScript的并不是为了让JavaScript改变执行方式,不是为了提高机器执行效率的.而编译型和解释型的分类是基于这两个特点的.但是,TypeScript具备编译型语言一个特点,就是它对类型进行检查,如果出现类型冲突时它是无法编译成js文件的. 既然TypeScript编译需要对变量进行类型检查,这就意味着TypeSc

TS(6)-- 类型推论、类型兼容性、高级类型

2019-11-09: 学习内容:类型推论.类型兼容性.高级类型 一.类型推论:类型是在哪里如何被推断的 在有些没有明确指出类型的地方,类型推论会帮助提供类型.如:let x = 3;  变量x的类型被推断为数字. 这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时.大多数情况下,类型推论是直截了当地. 最佳通用类型:如: let x = [0, 1, null];   两种选择:number 和 null , 计算通用类型算法会考虑所有的候选类型,并给出一个兼容所有候选类型的类型

TypeScript入门-泛型

泛型 要创建一个可重用的组件,其中的数据类型就必须要兼容很多的类型,那么如何兼容呢,TypeScript提供了一个很好的方法:泛型 Hello World 要兼容多种数据格式,可能会有人想到any,即 function identify(arg: any): any{    return arg; } 使用any存在一个问题,有可能传入的值和返回的值不是同一种值,例如,传入数字,但是不确定返回的是什么值 要解决这个问题,我们需要引入类型变量-一种特殊的变量,只用于表示类型不表示值 functio

typescript入门

安装typescripr编译器 npm install -g typescript 编辑.ts文件 tsc hello.ts 会编译出相对应的.js代码文件 优势: typescript是微软开发的javascript的超集遵循ES6规范,扩展了JS语法,现有的JS程序都可以不加修改的在TS下工作.TS添加了静态 类型和基于面向对象编程,并支持已经存在的JS库添加类型信息的头文件. 类型: string: 字符串 number: 数字 boolean: 布尔 any:任意值 void: 空值:他