以下在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 ) ;
我想要做的是更改定义Chicken
和Duck
或quack
,使quack(a)
出现编译时错误。即类型d
的参数Duck
不能保留Chicken
或任何其他不是Duck
的直接或间接实例的对象。我知道我可以为Chicken
和Duck
添加唯一属性以区分它们。 E.g。
class Duck extends Animal {
onlyInDuck : string ;
talk() : string { return "quack" ; }
}
class Chicken extends Animal {
onlyInChicken : string ;
talk() : string { return "cluck" ; }
}
但这似乎是一个粗暴的黑客。
是否有一种优雅的方法要求函数参数是参数类型的(子)类的实例?
答案 0 :(得分:2)
我可能在这里错了,但我猜可能不是。这似乎是为了使TypeScript语言更容易与现有的JavaScript代码互操作,以及包含语言的动态特性。
更具体地说,因为JavaScript(以及扩展名,TypeScript)实际上并没有"类型" (在经典意义上),TypeScript编译器更关心特定实例是否遵循特定接口,具有相同的属性,函数等,而不是它是否是使用特定构造函数创建的。 / p>
为了你的缘故,我希望自己错了,但无论如何也不会让我感到惊讶。