2

使用 TypeScript 1.6 可以编写函数来检查对象与接口。(以下是 MSDN 的公告和使用方法。)

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

  1. 发挥它的作用?
  2. 所有的猫都必须叫kitty吗?

用户定义的类型保护

[ 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 可以理解的类型,而且现在您可以使用接口并进行自定义分析。Guard 函数由它们的“a is X”返回类型表示,如果预期类型现在是什么,它会返回布尔值并向编译器发出信号。

4

2 回答 2

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的块中使用表达式 like and ,其中已经使用了检查,type ofa将是Catreturn 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;
}

我为您准备了示例,您可以使用它。

结论:

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

更新

  1. 发挥它的作用?
    • 是的,它会播放。a.name === 'kitty'- 这个表达式显示了检查给定动物是 - 的逻辑所以Cat,在这里你可以提供任何boolean表达式来检查给定的动物是Cat什至你可以返回只是truefalse
  2. 所有的猫都必须叫kitty吗?
    • 不,这取决于你。在函数isCat中,您可以提供任何逻辑来确保给定的动物是类型Cat
于 2015-09-22T09:52:08.073 回答
2

您的问题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

于 2016-03-08T19:53:42.273 回答