簡體   English   中英

使用裝飾器中的prototype / Access基類屬性訪問派生類中的基類屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM