[英]Javascript prototype extend base-class unable to access base-class properties/methods from prototype class
[英]Accessing base class properties in derived class using prototype/Access base class properties in the decorator
我正在使用打字稿,我正在為我的一個角度類寫一個自定義裝飾器。 我想訪問子類裝飾器中的基類方法。 或者使用子類原型訪問基類方法。 有沒有辦法做到這一點? 問題詳細解釋如下。
腳本
我有一個基類就像
export class Base {
public init() {
console.log('My base class function');
}
}
我有一個擴展這個基類的派生類
export class Child extends Base {
}
我想做什么
我正在嘗試為派生類編寫類似的裝飾器
@TestDecorator(['init'])
export class Child extends Base {
}
這將從基類調用init方法 。
問題是什么
為了完成上述場景,我編寫了類似下面的代碼
export function Tool<T extends Base>(methods: any[]) {
return function (target: Function) {
methods.forEach((item) => {
if (item === 'init') {
target.super.init() // Stuck here
}
})
}
}
我不明白如何使以下行工作
target.super.init() // Stuck here
請幫我解決這個問題。 我被卡住了。 謝謝
我相信你正在尋找這樣的東西:
export function Tool<T extends Base>(methods: any[]) {
return function (target: Function) {
return class extends target {
constructor(...args: any[]) {
super(...args)
methods.forEach((item) => {
if (item === 'init') {
super.init( );
}
})
}
}
}
}
為了擴展Paulpro的答案,由於裝飾器函數返回了它正在裝飾的類的構造函數的替代,它必須維護原始原型。
在以下示例中,由於TestDecorator<Base>
缺少init()
方法而導致錯誤。
class Base {
public init() {
console.log('My base class function');
}
}
function TestDecorator<T extends Base>(methods: any[]) {
return function (target: any) {
return class extends target {
constructor(...args: any[]) {
super(...args)
methods.forEach((item) => {
if (item === 'init') {
super.init( );
}
})
}
}
}
}
@TestDecorator(['init']) // Error: Property 'init' is missing in type 'TestDecorator<Base>.(Anonymous class)' but required in type 'Child'.
class Child extends Base {
}
let c = new Child();
function TestDecorator<T extends Base>(methods: any[]) {
return function (target: any) {
return class extends target {
init() {} // Define init()
constructor(...args: any[]) {
super(...args)
methods.forEach((item) => {
if (item === 'init') {
super.init( );
}
})
}
}
}
}
如果類裝飾器返回一個值,它將使用提供的構造函數替換類聲明。
注意:如果您選擇返回新的構造函數,則必須注意維護原始原型。 在運行時應用裝飾器的邏輯不會為您執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.