TS中的接口

TS中的接口和java还是有出入的,TS中接口可以用于对对象的形状进行描述,还可以对类的一部分行为行为进行抽象。

接口继承类

常见的面向对象语言中,接口是不能集成类的,但是在TypeScript中确实可以的(我接受不了):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

class Point {
    x: number;
    y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }
}

interface Point3d extends Point {
    z: number
}


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

为什么TypeScript会支持接口继承类呢?因为我们在声明class Point时,除了创建一个名为Point的类之外,同时创建了Point的类型(实例的类型)(该如何理解才好呢?类型其实就是接口么?)。

所以我们既可以将Point当一个类来使用(使用new Point创建它的实例),也可以将Point当做一个类型来使用(使用:Point表示参数的类型):

1
2
3
4
5
6
7

const p = new Point(1, 2);

function printPoint(p: Point){
    console.log(p.x, p.y);
}

值得注意的是,PointInstance相比于Point,缺少了constructor方法,这是因为声明Point类时创建的Point类型是不包含构造函数的。另外,除了构造函数是不包含的,静态属性或静态方法也是不包含的(实例的类型当然不应该包括构造函数、静态属性或静态方法)。

换句话说,声明Point类时创建的Point类型只包含其中的实例属性和实例方法。