接口

    以下两个是等效声明, 第一个使用内联注解,第二个使用接口:

    示例 B 的好处在于,如果有人创建了一个基于 的库来添加新成员, 他们可以轻松将此成员添加到 myPoint 的现有声明中:

    1. // Lib a.d.ts
    2. interface Point {
    3. x: number,
    4. y: number
    5. }
    6. declare const myPoint: Point
    7. interface Point {
    8. z: number
    9. // Your code
    10. let myPoint.z // Allowed!

    因为 TypeScript 接口是开放式的,这是 TypeScript 的一个重要原则,它允许你使用接口模仿 JavaScript 的可扩展性。

    基本上在 implements(实现) 的存在下,该外部 Point 接口的任何更改都将导致代码库中的编译错误,因此可以轻松地使其保持同步:

    1. interface Point {
    2. x: number;
    3. y: number;
    4. z: number; // New member
    5. class MyPoint implements Point {
    6. // ERROR : missing member `z`
    7. x: number;
    8. y: number;
    9. }

    注意,implements 限制了类实例的结构,即:

    foo: Point = MyPoint 这样并不是一回事。

    注意

    思考以下例子,其中可以使用 new 调用某些内容:

    1. interface Crazy {
    2. new (): {
    3. hello: number;

    你可能会有这样的代码:

    你可以使用接口声明所有的 JavaScript,甚至可以安全地从 TypeScript 中使用它们。但并不意味着你可以使用 TypeScript 类来实现它们。