打字稿:至少实现特定接口的类

时间:2018-11-15 15:02:40

标签: typescript class interface

我有以下问题。假设我有一个这样的接口

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中解决这个问题。

1 个答案:

答案 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);