在这个特定示例中,我像这样扩展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;。
答案 0 :(得分:2)
您只需添加Array.push
的原始签名:
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 |这个。
类型'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;
}