实现泛型接口的泛型类的Typescript定义

3
我可以帮助您进行翻译。以下是需要翻译的内容:

我有一个TypeScript定义文件,其中包含一个接口,如下所示:

   interface IStreamHandler<E> {
      stopStream(): void;
      process(E : E);
      onReady(bReady : boolean):void;
   }

我想要实例化它,所以我声明一个变量,如下:

 declare var StreamHandler: IStreamHandler<E>; 

但这是不被允许的。

我该如何创建定义语法以便我可以做到这一点?

   var sh = new StreamHandler<Animal>(); 
   sh.process(E: Animal){//code impl}

你能更详细地解释一下使用情况吗?“declare”通常用于告诉TypeScript已经存在的变量类型,但你也说你想实例化接口。接口从来没有被实例化过。有很多问题,请添加更多的解释。 - bert
2个回答

4
问题在于接口需要静态和实例接口的实现,以及构造函数(new())。以下代码可以解决这个问题:
interface IStreamHandler_Static {
    new<E>():IStreamHandler<E>; 
}
interface IStreamHandler<E> {
    stopStream(): void;
    process(e : E);
    onReady(bReady : boolean):void;
}

declare var StreamHandler: IStreamHandler_Static;

但如果是外部的,则最好完全声明该类。

interface IStreamHandler<E> {
    stopStream(): void;
    process(e : E);
    onReady(bReady : boolean):void;
}

declare class StreamHandler<E> implements IStreamHandler<E> {
    constructor() {}
    stopStream(): void;
    process(e : E);
    onReady(bReady : boolean):void;
}

我猜你需要在模块内部使用类。但是,我无法将其放在模块内部,因为我正在为一个不在模块内的JavaScript库编写TypeScript定义。 - Bhaskar

0

我觉得你想限制函数的参数类型,但是你想稍后提供函数的实现。这是我理解的一种实现方式。

interface Animals {
    walk():void
}

class Cat {
    walk =():void =>{
        alert("I am walking");
    }
}

interface IStreamHandler<E extends Animals> {
    stopStream(): void;
    process(E : E);
    onReady(bReady : boolean):void;
}

var animal:Animals = new Cat();  
var sh = <IStreamHandler<Cat>>{};

sh.process=(animal)=>{
    animal.walk();
}
sh.process(animal);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接