【发布时间】:2018-09-30 10:21:04
【问题描述】:
我有一个要扩展的基类:
export class BaseClass<T extends SomeOtherClass> {
constructor(param: ParamType) {
}
doSomething(param1: Param1Type): BaseClass<T> {
// do something with param1;
return this;
}
}
我的班级:
export class MyClass<T extends SomeOtherClass> extends BaseClass<T> {
constructor(param: ParamType) {
super(param);
}
doSomething(param1: Param1Type, param2: Param2Type): MyClass<T> {
// super.doSomething(param1);
// do something with param2;
return this;
}
}
但我收到警告:
Property 'doSomething' in type 'MyClass<T>' is not assignable to the same property in base type 'BaseClass<T>'.
Type '(param1: Param1Type, param2: Param2Type) => MyClass<T>' is not assignable to type '(param1: Param1Type) => BaseClass<T>'.
不能在打字稿中扩展方法签名吗?如果需要向被覆盖的方法添加参数,如何扩展 BaseClass 的功能,这是在 es6 语法中调用父方法的正确方法吗?我知道在 es6 之前我可以调用 BaseClass.prototype.doSomething.call(this, param1)。
【问题讨论】:
-
如果您将
MyClass的方法更改为doSomethingElse,这似乎可行。你甚至可以打电话给super.doSomething(param1)。 -
这也可以。我认为其他问题是原始方法正在返回对“this”的引用。在打字稿中,返回的 this 的类型是 ParentClass,它与 ChildClass 的形状不同。因此,子类的某些方法将返回 ParentClass “this”,而被覆盖的方法将返回 ChildClass “this”。两者实际上都会返回相同的对象,但打字稿似乎不喜欢它,因为它们看起来是不同的类型。
标签: javascript typescript inheritance