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

时间:2015-09-22 09:36:09

标签: typescript typescript1.6

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

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

  1. 扮演一个角色?
  2. 所有猫都必须叫kitty吗?
  3.   

    用户定义的类型保护

         

    [http://blogs.msdn.com/b/typescript/archive/2015/09/16/announcing-typescript-1-6.aspx]

         

    在早期版本的TypeScript中,您可以使用if语句   缩小类型。例如,您可以使用:

         

    if (typeof x === "number") { … }

         

    这有助于将信息流输入常用的工作方式   运行时的类型(受其他一些项目的启发   JS的类型检查。虽然这种方法很强大,但我们想要   进一步推动它。在1.6中,您现在可以创建自己的类型保护   功能:

    interface Animal {name: string; } 
    interface Cat extends Animal {
      meow(); 
    }
    
    function isCat(a: Animal): a is Cat {
      return a.name === 'kitty'; 
    }
    
    var x: Animal;
    
    if(isCat(x)) {
      x.meow(); // OK, x is Cat in this block
    }
    
         

    这使您不仅可以使用typeof和instanceof检查,   它需要一种JavaScript理解的类型,但现在你可以工作了   使用接口并进行自定义分析。表示保护功能   通过它们的“a is X”返回类型,它返回布尔值和信号   编译器,如果现在的预期类型是什么。

2 个答案:

答案 0 :(得分:3)

考虑你的例子

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,你可以玩它。

结论:

  1. 表达式a is Cat提供与a instanceof SomeClass相同的效果,但第一个是自定义检查而不是最后一个,最后一个不适用于接口。
  2. 您的检查功能可以包含任何代码 - 这是您的选择
  3. 这个未来让我们有可能检查如果实例是接口
  4. 更新

    1. 扮演一个角色?
      • 是的,它会播放。 a.name === 'kitty' - 此表达式显示检查给定动物 IS - Cat的逻辑,因此,您可以在这里提供检查给定动物的任何boolean表达式Cat即使您只能返回truefalse;
    2. 所有的猫都必须叫kitty吗?
      • 否。它是由你决定。在函数isCat中,您可以提供任何逻辑,以确保 给定 动物的类型为Cat

答案 1 :(得分:2)

您对return a.name === 'kitty';

的疑问

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

2)所有猫都必须叫猫咪吗? 是的,在这种情况下,所有的猫必须被称为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/