2017-07-14 128 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); 
}