TypeScript 入门 06 - 类(Class)类型
06 - 类(Class)类型
公共、私有与受保护的修饰符
public: 修饰的是在任何地方可见、公有的属性或方法
private: 修饰的是仅在同一类中可见、私有的属性或方法
protected: 修饰的是仅在类自身及子类中可见、受保护的属性或方法
注意:TS中定义类的私有属性仅仅代表静态类型检测层面的私有。
如果我们强制忽略TS类型的检查错误,转译且运行 JS 时依旧可以获取到 lastName 属性。
这是因为 JS 并不支持真正意义上的私有属性。
只读修饰符
如果我们不希望类的属性被更改,则可以使用 readonly 只读修饰符声明类的属性
class Son { public readonly firstName: string // ... }复制代码
存取器 setter / getter
通过对类属性访问的截取, 我们可以实现一些特定的访问控制逻辑
class Son { // ... get myLastName () { return this.lastName } set myLastName (name: string) { if (this.firstName === 'Tony') { this.lastName = name } else { console.error('Unable to change myLastName') } } }复制代码
静态属性
可以直接通过类访问静态属性
class God { static dnName = 'Jesus' } console.log(God.dnName) // 'Jesus'复制代码
注意: 不依赖实例this上下文的方法就可以定义成静态方法。
这意味这需要显式注解 this 类型才可以在静态方法中使用 this, 非静态方法则不需要显式注解 this 类型,因为 this 的指向默认是类的实例。
抽象类
可以使用抽象类定义派生类需要实现的属性和方法,同时可以定义其他被继承的默认属性和方法。
抽象类不能被实例化
abstract class Adder { abstract x: number abstract y: number abstract add(): number } class NumAdder extends Adder { x: number y: number constructor (x: number, y: number) { super(); this.x = x this.y = y } add (): number { return this.x + this.y } }复制代码
接口 interface 与 抽象类相比,接口只能定义类成员的类型
interface IA { x: number; y: number; add: () => number; } class NumAdder implements IA { x: number y: number constructor (x: number, y: number) { super(); this.x = x this.y = y } }复制代码
类的类型
在定义类的时候,我们声明的除构造函数外所有属性、方法的类型,就是这个特殊类型的成员。
声明类的同时,也声明了一个类型,就是这个类名
class A { name: string constructor (name: string) { this.name = name } } const a: A = { name: 'a'}
作者:崔华乐
链接:https://juejin.cn/post/7025904404842676255