首页 文章

用户定义的类型保护[typescript]

提问于
浏览
2

使用TypeScript 1.6,可以编写函数来检查对象的接口 . (以下是MSDN的宣布以及如何使用它 . )

我的问题针对的是返回表达式 return a.name === 'kitty';

  • 扮演一个角色?

  • 所有猫都必须叫kitty吗?

用户定义的类型保护[http://blogs.msdn.com/b/typescript/archive/2015/09/16/announcing-typescript-1-6.aspx]在早期版本的TypeScript中,您可以使用if语句缩小类型 . 例如,您可以使用:if(typeof x ===“number”)这有助于将信息流输入到运行时使用类型的常用方法(受到一些其他正在进行类型检查的项目的启发) . 虽然这种方法很强大,但我们希望进一步推进它 . 在1.6中,您现在可以创建自己的类型保护功能:interface Animal {name:string; }
接口Cat扩展Animal {
喵();
}

function isCat(a:Animal):a是Cat {
返回a.name ==='kitty';
}

var x:动物;

if(isCat(x)){
x.meow(); //好的,x在这个区块中是Cat
}
这使您不仅可以使用typeof和instanceof检查,这需要JavaScript理解的类型,但现在您可以使用接口并进行自定义分析 . Guard函数由它们的“a is X”返回类型表示,如果现在的预期类型是什么,它将返回布尔值并向编译器发送信号 .

2 回答

  • 2

    考虑你的例子

    interface Animal {name: string; } - an interface
    interface Cat extends Animal { - an implementation
      meow(); 
    }
    
    function isCat(a: Animal): a is Cat {
      return a.name === 'kitty'; // your special checking you can replace it with any other checking expression
    }
    
    var x: Animal;
    
    if(isCat(x)) {
      x.meow(); // OK, x is Cat in this block
    }
    

    此示例显示,现在,我们可以使用类似 a is Cat 的表达式,并且在已经使用了检查的后续块中, a 的类型将是 Cat . 您可以替换的 return a.name === 'kitty'; 表达式

    function isCat(a: Animal): a is Cat {
      return a["meow"] != undefined; // it also would be indicate that the animal is Cat
    }
    

    这将是工作 .

    即使你也可以用它替换它

    function isCat(a: Animal): a is Cat {
          return true;
    }
    

    我为你准备了example,你可以玩它 .

    Conclusions:

    • 表达式 a is Cat 提供与 a instanceof SomeClass 相同的效果,但第一个是可自定义检查而不是最后一个,最后一个不适用于接口 .

    • 您的检查功能可以包含任何代码 - 这是您的选择

    • 这个未来让我们有可能检查 if instance is inctanceof interface

    更新

    • 扮演一个角色?

    • 是的,它起作用 . a.name === 'kitty' - 这个表达式显示检查给定动物的逻辑 IS - Cat ,所以,在这里你可以提供任何 boolean 表达式,检查给定的动物是 Cat ,即使你只能返回 truefalse ;

    • 所有猫都必须叫kitty吗?

    • 不,这取决于你 . 在函数 isCat 中,您可以提供任何确保 given animal类型为 Cat 的逻辑

  • 3

    关于 return a.name === 'kitty'; 的问题:

    1)它是否起作用?
    是的,返回值确定类型保护是通过还是失败 .

    2)所有猫都必须叫kitty吗?
    是的,在这种情况下,所有猫必须被称为Kitty .

    它归结为什么,这不是一个很好的例子 .

    一个更好的将是......

    class Animal {name: string; type: string; }
    class Cat extends Animal {
      type: string = "Cat";
      meow() {}; 
    }
    
    function isCat(a: Animal): a is Cat {
      return a.type === 'Cat'; // your special checking you can replace it with any other checking expression
    }
    
    var x: Animal = new Cat();
    
    if(isCat(x)) {
      x.meow(); // OK, x is Cat in this block
    }
    

    看JSFiddle https://jsfiddle.net/penguin020/kwuf6yga/

相关问题