扩展 class 和接口的 Typescript 泛型

Typescript generics extending class and interface

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

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)

中所述

给定以下代码,您可以看到该方法有效。

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

这也是 ModelCorrect 成功的原因,而 extendsimplements 没有。

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

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

class Model {
}

class View<T extends IHasImage> {
}

这是 playground 的屏幕截图,验证它是否有效:

编辑: 添加了正确的解决方法。

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();
    }
}

示例中缺少的是 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;
    }       
}