类的三种修饰符 (这里缺醒的修饰符表示的是public 而不是default)

字段可以添加一个 readonly 前缀修饰符,这会阻止在构造函数之外的赋值

TypeScript 可以使用三种访问修饰符(Access Modifiers),分别是 public、private 和 protected。

  • public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
  • private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
  • protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的

TypeScript 编译之后的代码中,并没有限制 private 属性在外部的可访问性

readonly

只读属性关键字,只允许出现在属性声明或索引签名或构造函数中。

readonly 不能改变值 但是 可以通过别名修改(赋值给别的变量修改)

  1. interface person {
  2. readonly name: string
  3. readonly age: number
  4. }
  5. const a: person = {
  6. name: 'John',
  7. age: 36,
  8. }
  9. const b: {
  10. name: string
  11. age: number
  12. } = a
  13. b.age++;
  14. console.log(a);

抽象类

abstract 用于定义抽象类和其中的抽象方法

抽象类是不允许被实例化

抽象类实现接口

抽象类会实现接口的

接口

类实现接口

接口继承接口

接口继承类

类作为类类型使用

声明 类时创建的类的 类型只包含其中的实例属性和实例方法:

  1. class Point {
  2. /** 静态属性,坐标系原点 */
  3. static origin = new Point(0, 0);
  4. /** 静态方法,计算与原点距离 */
  5. static distanceToOrigin(p: Point) {
  6. return Math.sqrt(p.x * p.x + p.y * p.y);
  7. }
  8. /** 实例属性,x 轴的值 */
  9. x: number;
  10. /** 实例属性,y 轴的值 */
  11. y: number;
  12. /** 构造函数 */
  13. constructor(x: number, y: number) {
  14. this.x = x;
  15. this.y = y;
  16. }
  17. /** 实例方法,打印此点 */
  18. printPoint() {
  19. console.log(this.x, this.y);
  20. }
  21. }
  22. interface PointInstanceType {
  23. x: number;
  24. y: number;
  25. printPoint(): void;
  26. }
  27. let p1: Point;
  28. let p2: PointInstanceType;

Point 和类型 PointInstanceType 是等价的
接口继承类的时候,也只会继承它的实例属性和实例方法

ts中并不支持向上转型 如果一个属性是private 支持在类中并且传入的实例中引用

  1. class MySafe {
  2. private secretKey = 12345;
  3. }
  4. const s = new MySafe();
  5. // Not allowed during type checking
  6. console.log(s.secretKey);
  7. // Property 'secretKey' is private and only accessible within class 'MySafe'.
  8. // OK
  9. console.log(s["secretKey"]);

ts的private是弱私有 javascript的#是强私有

抽象构造签名

例如:new() => base

  1. function greet(ctor: new () => Base) {
  2. const instance = new ctor();
  3. instance.printName();
  4. }
  5. greet(Derived);
  6. greet(Base);