TypeScript/TS入-枚举和类兼容性

411 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

枚举类型兼容性

  • 数字枚举与数字兼容 定义了一个枚举类型,然后定义一个变量类型为该枚举,给这个变量赋值枚举值可以,赋值数字也可以,都不报错,说明数字枚举和数字兼容

enum Gender {
    Mate,
    FeMate
}

let value: Gender;
value = Gender.Mate;
value = 100;
  • 数字枚举与数字枚举不兼容 定义两个枚举类型,定义一个变量为其中一个枚举的类型,给变量赋值类型对应的枚举值可以,赋值另一个枚举值报错。


enum Gender {
    Mate,
    FeMate
}
enum Animal {
    Gog,
    Cat
}
let value: Gender;
value = Gender.Mate;
value = Animal.Gog;
  • 字符串枚举与字符串不兼容 声明一个字符串枚举,,定一个变量为该枚举的类型,给变量赋值该枚举成员均可,但是给该变量赋值字符串不行,直接报错了,虽然字符串的值和枚举的值一模一样。

image.png


enum Gender {
    Mate = "实则棒",
    FeMate = "大坏蛋"
}

let value: Gender;
value = Gender.Mate;
value = Gender.FeMate;
value = "大坏蛋"

类的兼容性

类的工作方式与对象字面类型和接口类似,但有一个例外;他们同时具有静态和实例类型,当比较一个类类型的两个对象时,只有实例的成员比较,静态成员和构造函数不影响兼容性 一个类中的私有成员和保护成员会影响其兼容性,当一个类的实例被检查兼容性时,如果目标类型包含一个私有成员,那么源类型也必须包含一个源自同一个类的私有成员,同样的,这也适用于有保护成员的实例,这允许一个类与它的超类进行赋值兼容,但不允许与来自不同继承层次的类型进行赋值兼容,否则就会有相同情况

public 可多不可少

class Animal {
    feet: number;
    age: number;
    constructor(feet: number, age: number) {
        this.age = age;
        this.feet = feet;
    }
}
class Size {
    feet: number;
    constructor(feet: string) {
        this.feet = 2
    }
}
let a: Animal = new Animal(2, 3);
let s: Size = new Size('23')
s = a;
a = s;

s赋值给a就报错了,缺少age.

image.png 不是来自同一个类的私有属性不兼容,俩私有属性都是一样的,但是不来自同一个类,所有不兼容


class Animal {
    private feet: number;
    constructor(feet: number, age: number) {
        this.feet = feet;
    }
}
class Size {
    private feet: number;
    constructor(feet: string) {
        this.feet = 2
    }
}
let a: Animal = new Animal(2, 3);
let s: Size = new Size('23')
s = a;
a = s;

image.png

下面的是可以的



class Base {
    private feet: number;
    constructor(feet: number) {
        this.feet = feet;
    }
}
class Animal extends Base {
    constructor(feet: number, age: number) {
        super(feet)
    }
}
class Size extends Base {
    constructor(feet: number) {
        super(feet)
    }
}
let a: Animal = new Animal(2, 3);
let s: Size = new Size(233)
s = a;
a = s;