В TypeScript три модификатора: public, protected и private.
Если к свойствам и функциям классов не применяется модификатор, то такие свойства и функции расцениваются как будто они определены с модификатором public
Если же к свойствам и методам применяется модификатор private, то к ним нельзя будет обратиться извне при создании объекта данного класса.
Модификатор protected во многом аналогичен private - свойства и методы с данным модификатором не видны из вне, но к ним можно обратиться из классов-наследников:
class User {
private name: string;
protected age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public displayInfo(): void {
console.log("name: " + this.name + "; age: " + this.age);
}
}
class Employee extends User {
private company: string;
constructor(name: string, age: number, company: string) {
super(name, age);
this.company = company;
}
public showData(): void {
console.log("Age: " + this.age);
//console.log("Name: " + this.name); // не работает, так как name - private
}
}
Методы доступа
class User {
private _name: string;
public get name(): string {
return this._name;
}
public set name(n: string) {
this._name = n;
}
}
let tom = new User();
tom.name = "Tom"; // срабатывает set-метод
console.log(tom.name); // срабатывает get-метод
Методы доступа определяются как обычные методы, только перед ними ставятся ключевые слова get/set. Set-метод контроллирует установку значения, а get-метод возвращает значение.
Обобщения
function getString<T>(arg: Array<T>): Array<T> {
let result = "";
for (let i = 0; i < arg.length; i++) {
if (i > 0)
result += ",";
result += arg[i].toString();
}
console.log(result);
return arg;
}
let result = getString<number>( [1, 2, 34, 5]);
console.log(result);
class User<T> {
private _id: T;
constructor(id:T) {
this._id=id;
}
getId(): T {
return this._id;
}
}
let tom = new User<number>(3);
console.log(tom.getId()); // возвращает number
let alice = new User<string>("vsf");
console.log(alice.getId()); // возвращает string
Миксины
class Animal {
feed():void {
console.log("кормим животное");
}
}
class Transport {
speed: number=0;
move(): void {
if (this.speed == 0) {
console.log("Стоим на месте");
}
else if (this.speed > 0) {
console.log("Перемещаемся со скоростью " + this.speed + " км/ч");
}
}
}
class Horse implements Animal, Transport {
speed: number=0;
feed: () => void;
move: () => void;
}
function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
derivedCtor.prototype[name] = baseCtor.prototype[name];
});
});
}
applyMixins(Horse, [Animal, Transport]);
let pony: Horse = new Horse();
pony.feed();
pony.move();
pony.speed = 4;
pony.move();