局部类型

在 3.1.2 节中,我们介绍了声明具有块级作用域的变量。TypeScript 同样支持声明具有块级作用域的局部类型,主要包括:

  • 局部枚举类型。

  • 局部类类型。

  • 局部接口类型。

  • 局部类型别名。

下例中在函数 f 内部分别声明了以上几种局部类型:

function f<T>() {
    enum E {
        A,
        B,
    }

    class C {
        x: string | undefined;
    }

    // 允许带有泛型参数
    interface I<T> {
        x: T;
    }

    // 可以引用其他局部类型
    type A = E.A | E.B;
}

此例中,枚举类型 E、类类型 C、接口类型 I 和类型别名 A 都是局部类型。局部类型也允许带有类型参数,并且可以引用外层作用域中的类型参数。

类似于 let 声明和 const 声明,局部类型拥有块级作用域。例如,下例中在 if 分支和 else 支持中均声明了接口 T,它们仅在各自所处的块级作用域内生效。因此,这两个接口 T 不会相互影响,并且 if 分支中的代码也无法引用 else 分支中的接口 T。示例如下:

function f(x: boolean) {
    if (x) {
        interface T {
            x: number;
        }

        const v: T = { x: 0 };

    } else {
        interface T {
            x: string;
        }

        const v: T = { x: 'foo' };
    }
}