gpt4 book ai didi

typescript - 在 TypeScript 接口(interface)中覆盖/覆盖方法签名

转载 作者:行者123 更新时间:2023-12-03 23:21:00 30 4
gpt4 key购买 nike

在这个特定的例子中,我扩展了 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;
}

但我收到以下编译时错误:

Interface 'BetterArray' incorrectly extends interface 'T[]'.
Types of property 'push' are incompatible. Type '(this: BetterArray, value: T) => this' is not assignable to type '(...items: T[]) => number'. Type 'this' is not assignable to type 'number'. Type 'BetterArray' is not assignable to type 'number'.



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

注意 - 我使用的是 TypeScript 2.0

进一步阅读 - 这似乎完全取决于返回类型 - 基本上我想通过接口(interface)强制执行,一个新的返回类型......
interface A {
fn(): number;
}

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

Interface 'B' incorrectly extends interface 'A'. Types of property 'fn' are incompatible. Type '() => this' is not assignable to type '() => number'. Type 'this' is not assignable to type 'number'. Type 'B' is not assignable to type 'number'.

最佳答案

只需添加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;
}
}

错误:

Type 'BetterArrayClass' is not assignable to type 'number | this'.
Type 'BetterArrayClass' is not assignable to type 'this'.
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描述。

关于typescript - 在 TypeScript 接口(interface)中覆盖/覆盖方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923554/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com