typescript - 如何使用可变参数重载函数

标签 typescript angular-pipe

我目前有一个接受可变参数的翻译管道

@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} attempts left 这样的消息,它在模板中的调用方式如下

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

但是,我们现在有一种情况,组件将 key 和替换参数作为数组(因为它不知道可能有多少个,因为 key 是由调用者提供的),我不知道为该方法创建重载的好方法。

我确实尝试从模板中传播参数,但这不是有效的语法

{{ 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);
    }
}

最佳答案

我刚刚遇到了类似的问题,我所做的就是拆分扩展数组的第一个可能的参数,使其成为联合类型,并在必要时将其添加到扩展数组之前。

结果有点像这样:

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);
}

关于typescript - 如何使用可变参数重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103601/

相关文章:

requirejs - TypeScript:仅包​​含语句的导入模块

javascript - 正则表达式适用于在线测试器,不适用于 Typescript Regexp

javascript - 将 UTC 时间转换为本地时间( Angular )

javascript - 为 angular2 创建管道以将 JSON 迭代到数组

Angular : Parser Error: Unexpected token -, 预期标识符、关键字或字符串

javascript - Jasmine 函数 Spy 不适用于 Angular

class - Angular 2 : Create objects from a class

Angular 5 - 如何在 DatePipe 中使周期字段类型小写

angular - Angular 中的 pipe() 函数是什么

angular - 使用 Angular Pipes 将一位数变成两位数