破解 import 语句以扩展继承的 class
Hacking the import statement to extend an inherited class
在我希望在不修改其代码的情况下扩展的库中,有几个 类 继承自同一个导入的库。那就是在这个 BaseClass
我需要覆盖一个特定的方法。
- 库中(用 TypeScript 编写):
import { BaseClass } from './base_class';
export class ClassA extends BaseClass {}
import { BaseClass } from './base_class';
export class ClassB extends BaseClass {}
…
- 在我想写的外部扩展中:
import { BaseClass } from 'library';
export class ExtendedBaseClass extends BaseClass {
oneMethod() {
const data = BaseClass.prototype.oneMethod.call(this);
// make additional things with data
return data;
}
}
有没有办法让这个新 ExtendedBaseClass
成为所有 ClassX
的父级?至少在它们的新扩展和重新导出版本中不需要复制它们的内部代码。
Is there a way for this new ExtendedBaseClass
to become the parent of all ClassX
s?
没有
另一种方法可能是直接在基础上替换一个方法 class:
import { BaseClass } from 'library';
const oneMethod = BaseClass.prototype.oneMethod;
Object.defineProperty(BaseClass.prototype, 'oneMethod', {
value() {
const data = oneMethod.call(this);
// make additional things with data
return data;
},
});
无法完全按照您的要求进行操作,但您可以通过单独扩展每个 class 来获得相同的结果。
ExtendedClassA extends ClassA {
oneMethod() {
// call a shared method if you need to reuse
}
}
// ExtendedClassB, etc
在我希望在不修改其代码的情况下扩展的库中,有几个 类 继承自同一个导入的库。那就是在这个 BaseClass
我需要覆盖一个特定的方法。
- 库中(用 TypeScript 编写):
import { BaseClass } from './base_class';
export class ClassA extends BaseClass {}
import { BaseClass } from './base_class';
export class ClassB extends BaseClass {}
…
- 在我想写的外部扩展中:
import { BaseClass } from 'library';
export class ExtendedBaseClass extends BaseClass {
oneMethod() {
const data = BaseClass.prototype.oneMethod.call(this);
// make additional things with data
return data;
}
}
有没有办法让这个新 ExtendedBaseClass
成为所有 ClassX
的父级?至少在它们的新扩展和重新导出版本中不需要复制它们的内部代码。
Is there a way for this new
ExtendedBaseClass
to become the parent of allClassX
s?
没有
另一种方法可能是直接在基础上替换一个方法 class:
import { BaseClass } from 'library';
const oneMethod = BaseClass.prototype.oneMethod;
Object.defineProperty(BaseClass.prototype, 'oneMethod', {
value() {
const data = oneMethod.call(this);
// make additional things with data
return data;
},
});
无法完全按照您的要求进行操作,但您可以通过单独扩展每个 class 来获得相同的结果。
ExtendedClassA extends ClassA {
oneMethod() {
// call a shared method if you need to reuse
}
}
// ExtendedClassB, etc