打字稿:通用接口,接口函数和类类型参数

时间:2018-04-06 02:13:17

标签: typescript generics interface

我正在尝试使用typescript实现通用discrete interval encoding tree。这里的通用意味着我希望允许区间端点是任意类,它扩展了一个简单的接口,指定离散线性顺序,强制存在两个方法成员np.where((arr[:,0] > ts - 1800) & (arr[:,0] < ts + 1800))next。因为我想输入我认为需要通用接口的方法(所有代码都可以在jsfiddle中找到):

lessThan

然后我用数字实例化了这个(好吧,它不是离散的,但把它想象为整数; - )

interface DiscreteLinearOrder<T> {
    next = () => T;
    lessThan = (y: T) => Boolean;
}

到此为止,它可以运行,并运行

之类的东西
class DLOnumber implements DiscreteLinearOrder<number> {
    private value: number;
    constructor(x: number) { this.value = x; }
    next = () => { return(this.value + 1); };
    lessThan = (y: number) => { return(this.value < y); };
    getValue = () => { return(this.value.toString()); }
}

解决了。

有了这个,我计划提供一个带有两个参数的类const bar = new DLOnumber(5); ,一个扩展离散线性顺序界面:

DLOinterval

但是这里出现了麻烦:我无法定义类型别名并使用它:

class DLOinterval<T, U extends DiscreteLinearOrder<T>> {
    private start: U;
    private end: U;
    private data: any;
    constructor(s: U, e: U, d: any) {
        this.start = s;
        this.end   = e;
        this.data  = d;
    }
}

我也不能直接实例化它:

type NumberInterval = DLOinterval<number, DLOnumber>;
const ggg = new NumberInterval(new DLOnumber(3),new DLOnumber(5),null)

我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

试试这个:

const aaa = new DLOinterval<number, DLOnumber>(new DLOnumber(3), new DLOnumber(5), null);

答案 1 :(得分:0)

您无需从DLOinterval类创建类型,您可以按如下方式直接使用它:

const ggg = new DLOinterval<number, DLOnumber>( new DLOnumber(3), new DLOnumber(5), null);

答案 2 :(得分:0)

由于注释部分中提到的错误,应用于DLOinterval<T, U extends DiscreteLinearOrder<T>> 的约束不会编译,因为它将变得像嵌套的无限约束。 它是如何为您服务的?

它应该正常工作的唯一方法是输入第二个约束,以便超越编译器的反对意见,将模板类型键入为T

class DLOinterval<V, U extends DiscreteLinearOrder<any>>

为了做一个mocha测试的工作示例,我扩展了与下面屏幕截图相同的界面:

enter image description here

相关问题