Skip to content

TS-04 枚举、类型推论

一、枚举

常用枚举场景:定义接口返回的code码,对应枚举属性,提高代码的可读性

索引枚举

默认值为0开始,也可以指定初始值,初始值也可以设置为常量,也可以是函数计算,当是函数计算时,后面的值就不能够再递增了,需要给定默认值;

ts
const test = 2
const getIndex = ():number => {
    return 2
}
enum Status {
    Uploading = test,
    Success = getIndex(),
    Faild = 2 // 不指定则报错
}

字符串枚举

字符串枚举只能使用自己枚举下面的成员,不能使用其他枚举中的成员;

ts
enum Message {
    Error: 'sorry error',
    Success: 'success',
    Fail = Error // 也可以直接使用成员,
}
console.log(Message.Error)

异构枚举

既有索引又有字符串的称为异构枚举

ts
enum Result {
    Faild = 0,
    Success = 'success'
}

如果不是特别需要,不建议使用异构枚举;

枚举成员类型和联合枚举类型

当一个枚举类型满足一定的条件的时候,那么枚举的每个成员,以及枚举其本身都可以作为类型来使用

满足的条件:

  • 不带初始值的枚举:enum E
  • 值为字符串字面量:enum E
  • 值为数值字面量或者带有负值正值都行:enum E

枚举成员类型

ts
enum Anima {
    Dog = 1,
    Cat = 2
}
interface Dog {
    type: Anima.Dog,
}
const dog: Dog = {
    type: Anima.Dog
}

联合枚举类型

(number | string)就是联合枚举类型

ts
enum Status {
    Off,
    On
}
interface Light {
    status: Status
}
const light: Light {
    status: Status.Off
}

const枚举

在枚举前面添加const,定义该枚举被编译后值为常量,不再为对象里面取值了,其他成员也都会在编译时被删除

枚举值编译完之后就是一个真实的对象,当使用const定义枚举之后编译的就直接是常量了;

ts
const enum Status {
    Success = 200
}
const S = Status.Success
// 编译之后直接是var s = 200

外部枚举

外部枚举使用declare enum定义的枚举类型

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

declare定义的类型只会用于编译检查,编译结果中会被删除;

ts的枚举类型的概念来源C#

二、类型推论

当定义一个变量不给类型时,ts会自动帮我们分配类型,例子如下:

ts
let str = 'haha'
str = 1 // 报错,已经推断出是string类型
  • 多类型联合
ts
let arr = [1, 'a']
arr = [1, 'a', false] // 报错,因为前者被默认推论出是(string | number)[]

当使用window对象时,需要在ts文件中引入dom库;

json
// tsconfig.json
{
    "lib": ["dom"]
}

函数类型兼容

  • 参数个数:要求等号右边的参数个数必须小于等于等号左边的参数个数
ts
let x = (a: number) => 0
let y = (b: number, c: number) => 0
y = x // 正常
x = y // 报错
  • 参数类型,必须一一对应

枚举类型兼容

枚举类型与数字类型兼容,并且数字类型与枚举类型兼容,不同枚举类型之间是不兼容的,比如:

ts
enum Status { On, Off }
enum Anima { Dog, Cat }
let s = Status.On
s = Anima.Dog

类的类型兼容

类主要是检测实例上的成员类型是否相同,如果相同则可以正常赋值,如果不相同则报错

如果是私有成员或者是有受保护成员,有这两个成员会对类的类型兼容造成影响,如果一个类包含一个私有成员,那么用来赋值的值也必须包含来自同一个类的私有成员

ts
class ParentClass {
  private age: number
  constructor(){}
}
class ChildrenClass extends ParentClass{
  constructor() {
    super()
  }
}
class OtherClass {
  private age: number
  constructor(){}
}
const parent5: ParentClass = new ChildrenClass()
const other: ParentClass = new OtherClass() // 报错,不是继承来的age属性

Released under the MIT License.