2014-12-30 3 views
2

기본 클래스 생성자에서 가변 인수를 사용하고 싶습니다. 파생 클래스에서도 마찬가지입니다. 생성자는 알 수없는 수의 인수를받을 수 있으며 일부 처리를 위해 기본 클래스 생성자에 전달하려고합니다. 나는 그것에 대한 좋은 해결책을 찾지 못했고, 이것은 spread operator으로 풀릴 수 있었는데, 분명히 TypeScript에는 없었습니다. in version 1.5 (오른쪽 I입니까?)을 개발됩니다기본 클래스에 가변 인수를 전달하는 방법

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

알아 두 셨 듯이 스프레드 연산자를 사용할 수 없습니다.

EDIT - Sidenote : 실제로 TypeScript 1.5에서 작동합니다. 그냥 해봐 super(...args);

이 pre 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[])처럼 보이지만, 당신이 직접 구현 서명을 호출 할 수 있음을 기억 가치가있다 따라서 오버로드 옵션으로 지정해야합니다.

배열의 배열을 전달하려는 경우이 예제는 테스트에 사용 된 논리를 손상시킬 수 있으므로 조정해야합니다. 그러나 실제로는 또는 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를 사용하려면 overload 옵션을 사용하십시오. – 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] 
관련 문제