2014-12-30 78 views
2

我想在基類構造函數中使用可變參數。派生類同樣的東西。構造函數可以接收未知數量的參數,並且我想將它們傳遞給基類構造函數,以進行一些處理。我沒有找到任何好的解決方案,看來這可以通過spread operator來解決,這顯然在TypeScript中不存在。將開發in version 1.5(是嗎?):如何將可變參數傳遞給基類

class TSBase{ 
    constructor(...args: any[]){ 
    //do stuff with args 
    } 
} 

class TSSomeController extends TSBase{ 
    constructor(...args: any[]){   
    //let base do some stuff 
    //super(...args); //this doesn't work, but it would be cool... :) 
    } 
} 

是什麼做的,在打字稿的最佳方式?我可以使用類似super.prototype.apply的東西嗎?

回答

4

正如您發現的那樣,spread運算符尚不可用。

編輯 - 附註:實際上,它現在在TypeScript 1.5中工作。只是做super(...args);

至於最好的方式來做到這一點前的TypeScript 1.5 ...它真的取決於,但這裏有一個解決方案,不涉及改變任何派生類,並保持你想做的事:

class TSBase { 
    constructor(...args: any[]) { 
    if (this.constructor != TSBase && args.length === 1 && args[0] instanceof Array) { 
     args = args[0]; 
    } 

    // work with args here... for example: 
    args.forEach((val) => console.log(val)); 
    } 
} 

class TSSomeController extends TSBase{ 
    constructor(...args: any[]){   
    super(args); 
    } 
} 

new TSBase(3, 4);     // 3, 4 
new TSBase([3, 4]);    // Array[2] 
new TSSomeController(3, 4);  // 3, 4 
new TSSomeController([3, 4]);  // Array[2] 
new TSSomeController([3, 4], 5); // Array[2], 5 

基本上,可以在基構造添加一個檢查使args陣列僅等於第一元件從派生類,當有一個參數被傳入時,並且當該參數是一個陣列。

0

你可以使用一個重載的構造函數來實現這一目標:

隨着重載/類型衛隊

class TSBase{ 
    constructor(args: any[]); 
    constructor(...args: any[]); 
    constructor(...args: any[]) { 
    if (Array.isArray(args[0])) { 
     args = args[0]; 
    } 

    // Do stuff 
    } 
} 

class TSSomeController extends TSBase{ 
    constructor(...args: any[]){   
    super(args); 
    } 
} 

雖然它看起來像constructor(...args: any[])是重複的,這是值得記住的是,你不能直接調用執行簽名,所以你必須把它列爲超載選項。

如果你打算傳遞一個數組數組,那麼這個例子將需要調整,因爲它會打破測試中使用的邏輯 - 但我認爲你會想要通過一個類型數組,如string[]MyType[],而不是any[]

無過載/類型衛隊

您也可以做到這一點沒有過載和類型衛士:

class TSBase{ 
    protected args: any[]; 

    constructor(...args: any[]){ 
     this.args = args; 
    } 

    getArgs() { 
     return this.args; 
    } 
} 

class TSSomeController extends TSBase{ 
    constructor(...args: any[]){ 
     super(null); 
     this.args = args;  
    } 
} 

var a = new TSBase(1, 2, 3); 
console.log(a.getArgs()); 

var b = new TSSomeController(4, 5, 6); 
console.log(b.getArgs()); 
+0

我沒有得到super(null);我想在TSBase.constructor中使用args做些什麼 – Paolo

+0

如果您想在構造函數中使用args,請使用重載選項。 – Fenton

2

在很多情況下具有inherited檢查有助於。這是其中之一:

class TSBase { 
    constructor(...args: any[]) { 
    if (this.constructor != TSBase) args = args[0]; 

    //do stuff with args  
    console.log(args); 
    } 
} 

class TSSomeController extends TSBase { 
    constructor(...args: any[]) { 
    super(args); 
    } 
} 


var base = new TSBase(1,2,3); // [1,2,3] 
var child = new TSSomeController(1,2,3); // [1,2,3] 
相關問題