类型保护

    TypeScript 熟知 JavaScript 中 和 typeof 运算符的用法。如果你在一个条件块中使用这些,TypeScript 将会推导出在条件块中的的变量类型。如下例所示,TypeScript 将会辨别 string 上是否存在特定的函数,以及是否发生了拼写错误:

    1. class Foo {
    2. foo = 123;
    3. common = '123';
    4. }
    5. class Bar {
    6. bar = 123;
    7. common = '123';
    8. }
    9. function doStuff(arg: Foo | Bar) {
    10. if (arg instanceof Foo) {
    11. console.log(arg.foo); // ok
    12. console.log(arg.bar); // Error
    13. }
    14. if (arg instanceof Bar) {
    15. console.log(arg.foo); // Error
    16. console.log(arg.bar); // ok
    17. }
    18. doStuff(new Bar());

    TypeScript 甚至能够理解 else。当你使用 if 来缩小类型时,TypeScript 知道在其他块中的类型并不是 if 中的类型:

    1. interface A {
    2. x: number;
    3. }
    4. interface B {
    5. y: string;
    6. }
    7. function doStuff(q: A | B) {
    8. if ('x' in q) {
    9. // q: A
    10. } else {
    11. // q: B
    12. }
    13. }

    当你在联合类型使里使用字面量类型时,你可以检查它们是否有区别:

    1. // 仅仅是一个 interface
    2. interface Foo {
    3. common: string;
    4. interface Bar {
    5. bar: number;
    6. common: string;
    7. }
    8. // 用户自己定义的类型保护!
    9. function isFoo(arg: Foo | Bar): arg is Foo {
    10. return (arg as Foo).foo !== undefined;
    11. }
    12. // 用户自己定义的类型保护使用用例:
    13. function doStuff(arg: Foo | Bar) {
    14. if (isFoo(arg)) {
    15. console.log(arg.foo); // ok
    16. console.log(arg.bar); // Error
    17. } else {
    18. console.log(arg.foo); // Error
    19. console.log(arg.bar); // ok
    20. }
    21. }
    22. doStuff({ foo: 123, common: '123' });