当前位置: 首页 > 知识库问答 >
问题:

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

艾望
2023-03-14

在这个特定的示例中,我扩展了数组

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

参考说明-Array

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

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

接口“BetterArray”错误地扩展了接口“T[]”
属性“推送”的类型不兼容。类型“(this:betterray,值:T)=

是否有任何方法可以强制指示TypeScript我想要覆盖我接口上的push(比如隐藏在C#中的成员)?

注意-我使用的是TypeScript 2.0

进一步阅读-这似乎是纯粹的返回类型-基本上我想强制接口,一个新的返回类型。。。

interface A {
    fn(): number;
}

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

接口“B”不正确地扩展了接口“A”。属性“fn”的类型不兼容。键入“()=


共有2个答案

谭云瀚
2023-03-14

根据nitzan tomer的回答

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

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

使用永远类型似乎适用于此。Intellisense拾取永远,"永远"返回,所以不用麻烦向您显示方法签名(整洁)

interface BetterArray<T> extends Array<T> {
    push(...items: T[]): never;
    push(this: BetterArray<T>, value: T): this;
}
廖琨
2023-03-14

您只需要添加数组的原始签名。推送

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

问题是,如果this是一个BetterArray,则不能返回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 | this”
类型“BetterArrayClass”不可分配给类型“this”<这是一个更好的课堂

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

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那么这个不是A而是B,在任何情况下,我们都希望返回B的实例
这不是A.fn所描述的。

 类似资料:
  • 问题内容: 为什么必须重写接口的所有方法? 例如,如果我有 我将有很多我什至不会使用的方法,有没有一种方法可以删除未使用的实现方法,例如,如果 我计划从接口中使用一种方法 我也不想使用抽象,因为这意味着我无法创建对象的实例(至少我的编译器这样说) 问题答案: 具体的类必须始终实现接口的所有方法。如果您还没有扩展,可以扩展。它实现了空方法,以避免将其写出来。您可以在类内部使用匿名类,如下所示:

  • 问题内容: 是否可以在Python中覆盖+ =? 问题答案: 是的,重写该方法。例:

  • 问题内容: 这是代码: 问题:代码可以编译并且一切正常。我想知道类Hello中的meth1()是否覆盖了哪个meth1()?接口中的ont或抽象类中的ont,为什么? 问题答案: 答案很简短:两者..... 实际上,是正确的:您不会 覆盖 任何一个,而是使用一种方法来 实现 它们两者。

  • 我这样做对吗?我生成了toString()。

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 问题内容: 我试图覆盖Java中的方法。我有一堂课,基本上有2个数据字段和。现在,我想重写方法,以便可以在2个对象之间进行检查。 我的代码如下 但是当我写它给我错误时,因为方法只能比较并且是。 Solution 我按照建议使用运算符,问题解决了。 问题答案: Output: `run: – Subash Adhikari - VS - K false – Subash Adhikari - VS