我有以下问题。假设我有一个这样的接口
interface Animal<T>{
children: Array<T>
}
现在我想写一个方法,以后再用鸟(实现Animal的类)。在编写该方法时,鸟的定义尚不存在。也可能是它被赋予了Shark的实例。但是最低的要求是,它收到的任何对象都必须是实现Animal的类的实例。
function doSomething(AnAnimal){
//Do something with animal
}
// Implementation with a class that implements Animal
class Bird<T> implements Animal{
children: Array<T>;
color: string;
chirp(){console.log('peep')}
constructor(Color:string){
this.color = Color;
}
}
let tweety = new Bird('yellow');
doSomething(Tweety)
我希望我能弄清楚我要做什么,您知道如何在TypeScript中解决这个问题。
答案 0 :(得分:3)
您需要在整个示例中传递类型参数...
interface Animal<T>{
children: Array<T>
}
function doSomething<T>(arg: Animal<T>){
//Do something with animal
}
class Bird<T> implements Animal<T>{
children: Array<T>;
color: string;
chirp(){console.log('peep')}
constructor(Color:string){
this.color = Color;
}
}
let tweety = new Bird('yellow');
doSomething(tweety);
例如,Bird<T>
必须实现Animal<T>
。 doSomething
函数必须是通用的,以便处理类型为Animal<T>
的参数。
您可能会发现您在此处不必要地将自己绑在类型参数中-因此您可能想要尝试使用非通用版本。
interface Animal {
children: Array<Animal>;
}
function doSomething(arg: Animal) {
//Do something with animal
}
class Bird implements Animal {
children: Array<Bird>;
biggestEnemy: Animal;
color: string;
chirp() { console.log('peep') }
constructor(Color: string) {
this.color = Color;
}
}
let tweety = new Bird('yellow');
doSomething(tweety);