文章转载自:https://zhongsp.gitbooks.io/typescript-handbook/content/doc/handbook/Classes.html

介绍

从 ECMAScript 2015 开始,JavaScript 程序可以使用基于类的面向对象方法。在 TypeScript 里,我们允许开发者现在就使用这些特性,并且编译后的 JavaScript 可以在所有主流浏览器和平台上运行。

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

var greeter = new Greeter("world");

继承

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);
    }
}

包含 constructor 函数的派生类必须调用 super(),它会执行基类的构造方法。

公共、私有与受保护的修饰符

在 TypeScript 里,每个成员默认为 public

class Animal {
    private name: string;
    constructor(theName: string) { this.name = theName; }
}
new Animal("Cat").name; // Error: 'name' is private

protected 修饰符与 private 修饰符的行为很相似,但 protected 成员在派生类中仍然可以访问。

参数属性

参数属性可以方便地让我们在一个地方定义并初始化一个成员:

class Animal {
    constructor(private name: string) { }
    move(distanceInMeters: number) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

存取器

TypeScript 支持 getters/setters 来截取对对象成员的访问:

class Employee {
    private _fullName: string;

    get fullName(): string { return this._fullName; }

    set fullName(newName: string) {
        if (passcode && passcode == "secret passcode") {
            this._fullName = newName;
        } else {
            console.log("Error: Unauthorized update of employee!");
        }
    }
}

注意:若要使用存取器,要求设置编译器输出目标为 ECMAScript 5 或更高。

静态属性

class Grid {
    static origin = {x: 0, y: 0};
    calculateDistanceFromOrigin(point: {x: number; y: number;}) {
        var xDist = (point.x - Grid.origin.x);
        var yDist = (point.y - Grid.origin.y);
        return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
    }
    constructor (public scale: number) { }
}

抽象类

抽象类是供其它类继承的基类,一般不会直接被实例化:

abstract class Animal {
    abstract makeSound(): void;
    move(): void {
        console.log('roaming the earth...');
    }
}

把类当做接口使用

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

var point3d: Point3d = {x: 1, y: 2, z: 3};

<
Previous Post
《TypeScript 中文入门教程》 1、基础数据类型
>
Next Post
转载:《TypeScript 中文入门教程》 11、声明合并