Typescript泛型扩展类和接口

时间:2015-02-02 08:32:57

标签: typescript

我有一个Typescript类,它包含一个需要扩展另一个类并实现接口的泛型。这是一个例子

interface IHasImage {
  imageUrl():string; 
}
class Model {
}
class View<T extends Model & IHasImage> {
}

这是我在其他地方看到的那种语法,但有没有办法在Typescript中做到这一点?

编辑: 尝试将以下内容粘贴到游乐场:http://www.typescriptlang.org/Playground

...[removed edit 1 code]

编辑2:回答和推理

(我道歉,第一个例子有一些缺陷!) 我在下面标记了正确的答案,虽然它可能需要一些指针,如本github问题所述(https://github.com/Microsoft/TypeScript/issues/1885

鉴于以下代码,您可以看到该方法有效。

playground screenshot

唯一要说的是,尝试implement来自不扩展基类的类的接口也会失败。但是,因为Typescript检查基于对象的结构,如果您手动将name属性添加到类中,它将成功。

enter image description here

这也是ModelCorrect成功extendsimplements成功的原因。

3 个答案:

答案 0 :(得分:14)

Typescript不像Java或C#那么严格,所以你可以这样做:

interface IHasImage {
    imageUrl():string; 
}

class Model {
}

// use the Model class like an interface
interface IHasImageModel extends IHasImage, Model{
}

class View<T extends IHasImageModel> {
    constructor(arg :T){
       arg.imageUrl();
    }
}

修改 在TypeScript 1.6中,您可以使用交集类型:

interface IHasImage {
    imageUrl():string; 
}

class Model {
}

class View<T extends IHasImage & Model> {
    constructor(arg :T){
       arg.imageUrl();
    }
}

答案 1 :(得分:3)

看起来这是我能找到的唯一方法。不是很干净,但它做对了。

interface IHasImage extends Model{  
  imageUrl():string; 
}

class Model {
}

class View<T extends IHasImage> {
}

以下是操场上的屏幕截图,确认其有效:

playground

修改:添加了正确的解决方法。

答案 2 :(得分:1)

示例中缺少的是T:

在下面的示例中,我添加了T的实现,可以用作通用约束。

interface IHasImage {
  imageUrl():string; 
}

class Model {
}

class ModelWithImage extends Model implements IHasImage {

    imageUrl():string
    {
     return "http://thepetwiki.com/images/thumb/Kitten.jpg/400px-Kitten.jpg";
    }   
}


class View<T extends ModelWithImage>
{
    value:T;

    constructor(arg:T)
    {   
        this.value=arg;
    }       
}