2017-08-23 49 views
0

我正在使用第三方庫並試圖註冊自己的控件,不幸的是它需要我將構造函數作爲參數傳遞,而之前沒有問題,但現在我試圖添加對控件的另一個依賴關係,不知道如何傳遞閉包作爲參數來滿足參數類型。如何將閉包作爲構造函數參數

登記方法有以下特徵:

class Registrator { 
    static Add(controlName: string, component: new (...params: any[]) => Control): void; 
} 

我之前跟隨着代碼,但重構後我出口一些代碼,使我的控制依賴於它:

//Old code - working 
Registrator.Add("CountdownTimer", Controls.CountdownTimer); 
//Trying to add Dependency - can't compile 
const countdownTimerFormater = new Objects.Time.TimeFormater(); 
Registrator.Add("CountdownTimer", (...params: any[]) => return new Controls.CountdownTimer(<HTMLElement>(params[0]), countdownTimerFormater)); 

編譯器錯誤: 類型'(... params:any [])=> CountdownTimer'的參數不能分配給'new(params:any [])=> Control'類型的參數。 類型'(... params:any [])=> CountdownTimer'不提供符合'new'(... params:any []):Control''的匹配。

參數取決於控件的上下文,在我的情況下它總是長度爲1,並且通過HTMLElement,它應該作爲控件的父級服務器。 考慮到JavaScript中的所有東西都是函數,我覺得應該有一種方法來傳遞閉包,以滿足參數或者將我的依賴從我的代碼推送到params。

+0

您是否嘗試將'component:new(... params:any [])=> Control'更改爲'component: (... params:any [])=> Control' – cyrix

+0

@cyrix無法更改註冊人。添加的簽名,因爲它不是 我自己的。 – CrudaLilium

回答

0

被請求的參數只是要求什麼時候它會做new就可以了,它會返回一個Control類。

做這樣的(假設CountdownTimerControl型):

Registrator.Add("CountdownTimer", Controls.CountdownTimer); 

如果你想創建的CountdownTime的countdownTimerFormater,你可以定義類內嵌,像這樣:

Registrator.Add("CountdownTimer", class CountdownTimer { 
    private countdownTimerFormater; 

    constructor(element: HTMLElement) { 
     this.countdownTimerFormater = new Objects.Time.TimeFormater(); 
    } 
} 
); 
+0

我曾經這樣做過,但之後改變了我的控制,現在需要另一個依賴/參數,有沒有辦法寫它,以便我可以在那裏傳遞依賴? – CrudaLilium

+0

[編輯答案]它看起來像'new'的代碼將只傳遞特定的參數給構造函數。如果你想訪問其他類,你需要一種不同的方式來獲得它們,比如內聯類聲明。 – gilamran

相關問題