【问题标题】:Typescript: generic interface, interface functions and class type parametersTypescript:泛型接口、接口函数和类类型参数
【发布时间】:2018-09-15 23:25:09
【问题描述】:

我正在尝试用 typescript 实现一个通用的discrete interval encoding tree。这里的泛型意味着我希望允许区间端点是任意类,这些类扩展了一个指定离散线性顺序的简单接口,该接口强制存在两个 method 成员 nextlessThan。因为我想键入我假设我需要一个通用接口的方法(所有代码都可以在这个jsfiddle中找到):

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)

我也不能直接实例化它:

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

我在这里错过了什么?

【问题讨论】:

  • 当您将 NumberInterval 定义为type NumberInterval = DLOInterval&lt;number, DLOnumber&gt;; 时,您定义的是一个类型,而不是类构造函数,所以我认为您不应该调用new NumberInterval(...)。另外请注意,在type NumberInterval = DLOInterval&lt;number, DLOnumber&gt;; 中,DLOinterval 应使用小写的“i”(基于您的类构造函数)。
  • 谢谢,已解决。
  • 此未决问题可能与此处相关:github.com/Microsoft/TypeScript/issues/1213
  • 啊啊,太好了!!!这就是我正在寻找的。​​span>

标签: typescript generics interface


【解决方案1】:

试试这个:

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

【讨论】:

  • 好点。在小提琴中,我实际上使用 T 作为构造函数的类型并在构造函数中调用 new.. ,但在这两种情况下我都会得到 ReferenceError: U is not defined
  • 谢谢,类型别名确实不起作用,但直接实例化可以。
  • 我的构造函数错了:constructor(s: T, e: T, d: any) { this.start = new U(s); ...} 不起作用,U 没有定义。
  • 顺便说一句,你知道为什么const bar = new DLOnumber('hello');这不会报错吗?
  • 它对我有用:“'"hello"' 类型的参数不可分配给 'number' 类型的参数。”
【解决方案2】:

你不需要从DLOinterval类创建类型,你可以直接使用它,如下:

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

【讨论】:

    【解决方案3】:

    由于评论部分提到的错误,应用于DLOinterval&lt;T, U extends DiscreteLinearOrder&lt;T&gt;&gt;的约束无法编译,因为它会变成一个嵌套的无限约束。 它对您有何帮助?

    它应该正确工作的唯一方法是键入第二个约束,以克服编译器将模板类型键入为T 的反对意见。

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2021-07-04
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多