TypeScript接口中的覆盖/覆盖方法签名

时间:2016-10-07 18:17:18

标签: typescript

在这个特定示例中,我像这样扩展Array<T>接口:

interface BetterArray<T> extends Array<T> {
    push(this: BetterArray<T>, value: T): this;
}

注意供参考 - Array<T>.push像这样实现

interface Array<T> {
    push(...items: T[]): number;
}

但是我得到以下编译时错误:

  

界面&#39; BetterArray&#39;错误地扩展界面&#39; T []&#39;。
  财产类型&#39;推动&#39;是不相容的。       输入&#39;(this:BetterArray,value:T)=&gt;这&#39;不能分配类型&#39;(...项目:T [])=&gt;数&#39 ;.         输入&#39; this&#39;不能分配类型&#39;数字&#39;。           输入&#39; BetterArray&#39;不能分配类型&#39;数字&#39;。

有什么方法可以强行指示我想要覆盖我的界面上的推送的TypeScript(如member hiding in C#

注意 - 我使用的是TypeScript 2.0

进一步阅读 - 看来这纯粹归结为返回类型 - 基本上我想通过接口强制执行,一个新的返回类型......

interface A {
    fn(): number;
}

interface B extends A {
    fn(): this;
}
  

接口&#39; B&#39;错误地扩展界面&#39; A&#39;。财产类型   &#39; FN&#39;是不相容的。       输入&#39;()=&gt;这&#39;不能分配给&#39;()=&gt;数&#39 ;.         输入&#39; this&#39;不能分配类型&#39;数字&#39;。           输入&#39; B&#39;不能分配类型&#39;数字&#39;。

2 个答案:

答案 0 :(得分:2)

您只需添加Array.push的原始签名:

interface BetterArray<T> extends Array<T> {
    push(...items: T[]): number;
    push(this: BetterArray<T>, value: T): this;
}

您要执行的操作的问题是,如果thisBetterArray,则您无法返回this,例如:

class BetterArrayClass<T> extends Array<T> {
    push(...items: T[]): number;
    push(this: BetterArrayClass<T>, value: T): this;
    push(this: BetterArrayClass<T>, ...items: T[]): number | this {
        return this;
    }
}

错误:

  

类型'BetterArrayClass'不能分配给'number |这个。
  类型'BetterArrayClass'不能指定为'this'类型。
  这个:BetterArrayClass

在这个更简单的例子中可以看到原因:

class A {
    fn(this: A, num: number): this {
        return this; // Error: Type 'A' is not assignable to type 'this'. this: A
    }
}

class B extends A {
    fn(num: number): this {
        if (num < 0) {
            return super.fn(num);
        }
        return this;
    }
}

如果在B.fn我们正在调用super.fn,则this不是A而是B,并且无论如何我们都希望返回实例B 这不是A.fn描述的内容。

答案 1 :(得分:0)

根据nitzan tomer's | answer

您只需要添加Array.push的原始签名:

interface BetterArray<T> extends Array<T> {
    push(...items: T[]): number;
    push(this: BetterArray<T>, value: T): this;
}

使用never类型似乎适用于此。 Intellisense选择never,“从不”返回,因此不会向您显示方法签名(整洁)

interface BetterArray<T> extends Array<T> {
    push(...items: T[]): never;
    push(this: BetterArray<T>, value: T): this;
}