示例

  1. class Greeter {
  2. greeting: string;
  3. constructor(greeting: string) {
  4. this.greeting = greeting;
  5. }
  6. greet() {
  7. return 'Hello' + this.greeting;
  8. }
  9. }
  10. const greeter = new Greeter('typescript');

类继承

关键字:extends 继承父类,super 代表父类

  1. class Animal {
  2. name: string;
  3. constructor(n: string) {
  4. this.name = n;
  5. }
  6. run(step: number = 10) {
  7. console.log(`${this.name}run${step}m...`);
  8. }
  9. }
  10. class Dog extends Animal {
  11. constructor(name: string) {
  12. super(name);
  13. }
  14. }
  15. class Horse extends Animal {
  16. constructor(name: string) {
  17. super(name);
  18. }
  19. run() {
  20. super.run();
  21. console.log('horse runing');
  22. }
  23. }
  24. const dog = new Dog('哈士奇');
  25. dog.run();
  26. // 可以指定父类
  27. const horse: Animal = new Horse('赤兔');
  28. horse.run();

封装

修饰属性或者方法、构造方法

public

默认,所有地方都可以访问

  1. class Animal {
  2. name: string;
  3. constructor(name: string) {
  4. this.name = name;
  5. }
  6. setName(name: string) {
  7. this.name = name;
  8. }
  9. }
  10. class Dog extends Animal {
  11. constructor(name: string) {
  12. super(name);
  13. }
  14. setPName(name: string) {
  15. super.setName(name);
  16. }
  17. }
  18. let animal = new Animal('旺财');
  19. // 可以自由访问
  20. console.log(animal.name);
  21. let dog = new Dog('二哈');
  22. console.log(dog.name);

protect

只能在类或者子类中才能访问或方法 给类加 protectd 可以限制父类被创建实例

  1. class Animal {
  2. protected name: string; // 只能在类或者子类中才能访问
  3. constructor(name: string) {
  4. // 如果加protected,只能在子类调用构造方法
  5. this.name = name;
  6. }
  7. }
  8. class Dog extends Animal {
  9. constructor(name: string) {
  10. super(name);
  11. }
  12. }
  13. let animal = new Animal('旺财');
  14. // error:属性“name”受保护,只能在类“Animal”及其子类中访问
  15. console.log(animal.name);
  16. let dog = new Dog('二哈');
  17. // error:属性“name”受保护,只能在类“Animal”及其子类中访问
  18. console.log(dog.name);

private

类中才能访问

  1. class Animal {
  2. private name: string; // 只能在类或者子类中才能访问
  3. constructor(name: string) {
  4. // 如果加protected,只能在子类调用构造方法
  5. this.name = name;
  6. }
  7. }
  8. class Dog extends Animal {
  9. constructor(name: string) {
  10. super(name);
  11. }
  12. }
  13. let animal = new Animal('旺财');
  14. // error:属性“name”为私有属性,只能在类“Animal”中访问
  15. console.log(animal.name);
  16. let dog = new Dog('二哈');
  17. // error:属性“name”为私有属性,只能在类“Animal”中访问
  18. console.log(dog.name);

readonly:

只读属性

  1. class Cat {
  2. private name: string;
  3. readonly color: string;
  4. constructor(name: string, color: string) {
  5. this.color = color;
  6. this.name = name;
  7. }
  8. }
  9. let cat = new Cat('黑猫警长', 'black');
  10. // error:无法分配到 "color" ,因为它是只读属性。
  11. cat.color = 'red';

存取器 get/get

  1. class Employee {
  2. private _fullName: string;
  3. private _setable: boolean;
  4. constructor(_fullName: string, setable: boolean) {
  5. this._fullName = _fullName;
  6. this._setable = setable;
  7. }
  8. get fullName(): string {
  9. return this._fullName;
  10. }
  11. set fullName(fullName: string) {
  12. if (this._setable) {
  13. this._fullName = fullName;
  14. } else {
  15. console.error('不支持修改');
  16. }
  17. }
  18. }
  19. const e1 = new Employee('李狗蛋', false);
  20. e1.fullName = '吴彦祖';
  21. const e2 = new Employee('张翠华', true);
  22. e2.fullName = '汤唯';

static 静态属性、方法

  1. class Student {
  2. static grade = 2;
  3. constructor() {}
  4. static study() {
  5. console.log(Student.grade);
  6. }
  7. }

抽象类和抽象方法 abstract

抽象类不能用于创建实例
抽象方法和接口定义方法类似
也可以加修饰符 protected

  1. abstract class Animal {
  2. constructor() {}
  3. // 方法“run”不能具有实现,因为它标记为抽象
  4. abstract run(): void;
  5. eat() {
  6. console.log('eat');
  7. }
  8. }
  9. class Dog extends Animal {
  10. run() {
  11. console.log('run');
  12. }
  13. sleep() {}
  14. }
  15. var dog = new Dog();
  16. dog.run();
  17. // 无法创建抽象类的实例
  18. // var a = new Animal()
  19. var dog2: Animal = new Dog();
  20. // 类型“Animal”上不存在属性“sleep”
  21. // dog2.sleep()

高级技巧

  1. class Greeter {
  2. static defaultMsg = '你好!';
  3. greeting: string | undefined;
  4. constructor(msg?: string) {
  5. this.greeting = msg;
  6. }
  7. greet() {
  8. if (this.greeting) {
  9. return 'hello' + this.greeting;
  10. } else {
  11. return Greeter.defaultMsg;
  12. }
  13. }
  14. }
  15. const g = new Greeter('hahhah');
  16. console.log(g.greet());
  17. // 修改构造器的静态属性
  18. let GreeterMaker: typeof Greeter = Greeter;
  19. GreeterMaker.defaultMsg = 'miximixi';
  20. const g2: Greeter = new GreeterMaker();
  21. console.log(g2.greet());
  22. const g3 = new Greeter();
  23. console.log(g3.greet());