【问题标题】:Convert JS sprintf to Typescript equivalent将 JS sprintf 转换为等效的 Typescript
【发布时间】:2018-07-01 02:52:47
【问题描述】:

寻找一种用于 Javascript 的“sprintf”函数,我发现这个小函数既简单又能满足我的需求:

function sprintf(format) {
    var args = Array.prototype.slice.call(arguments, 1);
    var i = 0;
    return format.replace(/%s/g, function() {
        return args[i++];
    });
}

(原文来源:https://gist.github.com/rmariuzzo/8761698

问题是我想在Angular 4应用程序中使用这个函数,用Typescript编写,所以我不能调用它,因为编译器抱怨参数的数量与函数所需的不匹配。

我知道有 Typescript 等价物 (f.i. https://github.com/alexei/sprintf.js),但需要使用 npm 安装模块,而且比我需要的要复杂得多。

我从来没有在 Typescript 中使用过多个参数函数(除了在可选参数上使用“?”),所以我不知道如何调整这个函数以在 Angular 应用程序中使用。

有什么想法吗?谢谢!

【问题讨论】:

  • JavaScript 代码是 TypeScript 代码。它无法转换为它已经存在的状态。
  • 我知道 Typescript 会转译为 Javascript,但也更严格,不是吗?当我尝试调用this.sprintf("¿Delete object %s (%s)?", objId, objName); 时,编译器给出错误“提供的参数与调用目标的任何签名都不匹配”。我怎样才能以正确的方式调用它?
  • 您可以注释参数的类型,例如function sprintf(...format: any[]),或者直接忽略错误。无论类型检查错误如何,TypeScript 都会发出代码。所有的 JavaScript 都是 TypeScript 代码。话虽如此,你到底为什么要使用这么讨厌的功能?
  • 我无法编译应用程序,它总是抱怨参数不匹配。关于我为什么要使用这样的函数:我来自 PHP,并且多年来一直在使用它的“sprintf”函数。你在 Javascript 中使用过类似的东西吗?

标签: javascript typescript


【解决方案1】:

你可以使用rest parameters:

function sprintf(format, ...args) {
    var i = 0;
    return format.replace(/%s/g, function() {
        return args[i++];
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多