2017-07-14 125 views
0

我現在有一個翻譯管道將採用可變參數如何重載可變參數

@Pipe({name: 'translate', pure: true}) 
export class TranslationPipe { 
    constructor(private service: TranslationService) {} 
    transform(key: string, ...params: (number|string)[]): string { 
     // The translation service takes an array 
     return this._service.translate(key, params); 
    } 
} 

對於像error.message=You have {0} of {1} tries left消息的功能,這就是所謂的像一個模板下面

{{ 'error.message' | translate : currentTry : totalTriesAllowed }} 

然而,我們現在有一個情況,一個組件將密鑰和替換參數作爲一個數組(因爲它不知道有多少可能是因爲調用者提供的密鑰),我不知道有一個好方法爲該方法創建一個過載。

我曾嘗試從模板傳播論點,但不是有效的語法

{{ translationKey | translate : ...translationArgs }} 

爲了能夠使這項工作,我想我需要一個像超載以下,這樣的翻譯管也可以傳遞一個數組作爲第一個參數,而不是單獨的參數

transform(key: string, params: (string|number)[]): string; 
transform(key: string, ...params: (string|number)[]): string; 

但是,我一直沒能找到支持此重載一個良好的實施。這是我目前的地方。

type ArryayOfStringOrNumber = (string|number)[]; 
export class TranslationPipe { 
    // ERROR: Overload signature is not compatible with function implementation 
    transform(key: string, params: ArryayOfStringOrNumber): string; 
    transform(key: string, ...params: ArryayOfStringOrNumber): string; 
    transform(key: string, ...params: ArryayOfStringOrNumber): any { 
     if (params[0] instanceof Array) { 
      // ERROR: The left-hand side of an 'instanceof' expression must 
      //  be of type 'any', an object type or a type parameter. 
      params = params[0] as ArryayOfStringOrNumber; 
     } 
     return this._service.translate(key, params as ArryayOfStringOrNumber); 
    } 
} 
+0

爲什麼不能讓你的代碼按,而是傳遞數組通過使用擴展語法到其餘參數? 'pipe.transform(key,... args);' –

+0

@DavidSherret問題是關於能夠從模板調用這樣的函數。 '{{translationKey | translate:... translationArgs}}'不起作用。我不確定你的建議。 –

+0

對不起,我沒有詳細閱讀這個問題,所以我沒有注意到它是關於角度的。難怪我對'{{...}}'語法感到困惑:) –

回答

0

的問題是,實現過載功能有接受對象,其中每個可以是(string|number)[]型或這些的陣列的陣列,即((string|number)[])[]

transform(key: string, ...params: (ArryayOfStringOrNumber|(string|number))[]): any { 
    if (params[0] instanceof Array) { 
     params = params[0] as ArryayOfStringOrNumber; 
    } 
    return this._service.translate(key, params as ArryayOfStringOrNumber); 
} 
0

我剛一類似的問題和我所做的是分裂傳播數組的第一個可能的參數,使其成爲聯合類型,並在必要時將其前置到傳播數組。

結果是有點這樣的:

foo(bar: Bar): void; 
foo(...bazs: Array<Baz>): void; 
foo(barOrBaz: Bar | Baz, ...bazsRest: Array<Baz>): void { 
    if (barOrBaz instanceof Bar) { 
     let bar = barOrBaz; 
     // first overload 
    } else { 
     let bazs = [barOrBaz, ...bazsRest]; 
     // second overload 
    } 
} 

所以你的情況的實施也可以寫成這樣:

transform(key: string, paramsFirst: string | number | ArrayOfStringOrNumber, ...paramsRest: ArrayOfStringOrNumber): string { 
    let params = paramsFirst instanceof Array ? paramsFirst : [paramsFirst, ...paramsRest]; 
    return this._service.translate(key, params); 
}