Классы представляют собой общие поведения и атрибуты группы связанных объектов.

Например, нашим классом может быть Student, у каждого из которых есть метод attendClass. С другой стороны, John является отдельным экземпляром типа Student и может иметь дополнительные уникальные поведения, такие как attendExtracurricular.

Вы объявляете классы с помощью ключевого слова class:

class Student {
	studCode: number;
	studName: string;
	constructor(code: number, name: string) {
		this.studName = name;
		this.studCode = code;
	}
}

В TypeScript, при объявлении свойств классов, нельзя использовать ключевое слово const. При попытке использования этого ключевого слова выводится следующее сообщение об ошибке: A class member cannot have the ‘const’ keyword. В TypeScript 2.0 имеется модификатор readonly, позволяющий создавать свойства класса, предназначенные только для чтения:

class MyClass {
    readonly myReadonlyProperty = 1;
 
    myMethod() {
        console.log(this.myReadonlyProperty);
    }
}
 
new MyClass().myReadonlyProperty = 5; // ошибка, так как свойство предназначено только для чтения

Вы можете использовать функцию super() для вызова конструктора базового класса.

class Animal {
  name: string;
  constructor(theName: string) {
    this.name = theName;
  }
  move(distanceInMeters: number = 0) {
    console.log(`${this.name} moved ${distanceInMeters}m.`);
  }
}
 
class Snake extends Animal {
  constructor(name: string) {
    super(name);
  }
  move(distanceInMeters = 5) {
    console.log("Slithering...");
    super.move(distanceInMeters);
  }
}

TypeScript позволяет объявлять множество вариантов методов, но реализация может быть лишь одна, и эта реализация должна иметь сигнатуру, совместимую со всеми вариантами перегруженных методов. Для перегрузки конструктора класса можно воспользоваться несколькими подходами:

  • Можно воспользоваться необязательным параметром:

    class Box {
      public x: number;
      public y: number;
      public height: number;
      public width: number;
     
      constructor();
      constructor(obj: IBox);
      constructor(obj?: any) {
        this.x = (obj && obj.x) || 0;
        this.y = (obj && obj.y) || 0;
        this.height = (obj && obj.height) || 0;
        this.width = (obj && obj.width) || 0;
      }
    }
  • Можно воспользоваться параметрами по умолчанию:

    class Box {
      public x: number;
      public y: number;
      public height: number;
      public width: number;
     
      constructor(obj: IBox = { x: 0, y: 0, height: 0, width: 0 }) {
        this.x = obj.x;
        this.y = obj.y;
        this.height = obj.height;
        this.width = obj.width;
      }
    }
  • Можно использовать дополнительные перегрузки в виде методов статической фабрики:

    class Person {
      static fromData(data: PersonData) {
        let { first, last, birthday, gender = "M" } = data;
        return new this(`${last}, ${first}`, calculateAge(birthday), gender);
      }
     
      constructor(
        public fullName: string,
        public age: number,
        public gender: "M" | "F",
      ) {}
    }
     
    interface PersonData {
      first: string;
      last: string;
      birthday: string;
      gender?: "M" | "F";
    }
     
    let personA = new Person("Doe, John", 31, "M");
    let personB = Person.fromData({
      first: "John",
      last: "Doe",
      birthday: "10-09-1986",
    });
  • Можно использовать тип-объединение:

    class foo {
      private _name: any;
      constructor(name: string | number) {
        this._name = name;
      }
    }
    var f1 = new foo("bar");
    var f2 = new foo(1);

Назад