要求参数是typescript

时间:2016-01-15 02:06:17

标签: typescript

以下在TypeScript中编译时没有错误

abstract class Animal {
    abstract talk() : string ;
}

class Chicken extends Animal {
    talk() : string { return "cluck" ; }
}

class Duck extends Animal {
    talk() : string { return "quack" ; }
}

function quack( d : Duck ) {
    console.log( d.talk() ) ;
}

var a = new Chicken() ;  // EDIT: `var a : Chicken = new Chicken()` gives the same result

quack( a ) ;

我想要做的是更改定义ChickenDuckquack,使quack(a)出现编译时错误。即类型d的参数Duck不能保留Chicken或任何其他不是Duck的直接或间接实例的对象。我知道我可以为ChickenDuck添加唯一属性以区分它们。 E.g。

class Duck extends Animal {
    onlyInDuck : string ;
    talk() : string { return "quack" ; }
}

class Chicken extends Animal {
    onlyInChicken : string ;
    talk() : string { return "cluck" ; }
}

但这似乎是一个粗暴的黑客。

是否有一种优雅的方法要求函数参数是参数类型的(子)类的实例?

1 个答案:

答案 0 :(得分:2)

我可能在这里错了,但我猜可能不是。这似乎是为了使TypeScript语言更容易与现有的JavaScript代码互操作,以及包含语言的动态特性。

更具体地说,因为JavaScript(以及扩展名,TypeScript)实际上并没有"类型" (在经典意义上),TypeScript编译器更关心特定实例是否遵循特定接口,具有相同的属性,函数等,而不是它是否是使用特定构造函数创建的。 / p>

为了你的缘故,我希望自己错了,但无论如何也不会让我感到惊讶。