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

Например, нашим классом может быть 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);

Назад