Typescript String.format 不存在

Usr*_*Usr 2 string-interpolation typescript

我有一个字符串常量,我必须替换两个单词,如下所示:

public static readonly MY_STRING: string = 'page={0}&id={1}';
Run Code Online (Sandbox Code Playgroud)

0和1必须用其他字符串替换。我在不同的答案中读到过有关 String.format 的内容,他们建议提供这样的实现:

if (!String.prototype.format) {
  String.prototype.format = function() {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number]
        : match
      ;
    });
  };
}
Run Code Online (Sandbox Code Playgroud)

但当我String.format这样做时它告诉我

Property 'format' does not exist on type 'String'
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用字符串插值/替换的正确方法是什么?对于格式我会做这样的事情:

 MY_STRING.format(page, id)
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?

jca*_*alz 7

修改本机原型(例如String. 由于 JavaScript 中没有标准或商定的format()字符串方法,因此添加您自己的方法可能会导致在同一运行时运行的任何代码中出现意外行为。您的实现甚至会检查现有的String.prototype.format第一个,这意味着如果有人首先使用不同的实现,那么可能就是那个出现意外行为的人。

只要有一个stringFormat您使用的函数就绝对没有问题,如下所示:

function stringFormat(template: string, ...args: any[]) {
    return template.replace(/{(\d+)}/g, function (match, number) {
        return typeof args[number] != 'undefined'
            ? args[number]
            : match
            ;
    });
};

const myString: string = 'page={0}&id={1}';
const formattedWithFormat = stringFormat(myString, 123, 456);
console.log(formattedWithFormat); // page=123&id=456
Run Code Online (Sandbox Code Playgroud)

此外,JavaScript 具有模板文字,它们提供本质上相同的功能:

const myTemplate = (page: number, id: number) => `page=${page}&id=${id}`;
const formattedWithTemplate = myTemplate(123, 456);
console.log(formattedWithTemplate); // page=123&id=456
Run Code Online (Sandbox Code Playgroud)

如果您打算修改 的原型String并且之前的警告没有阻止您,那么您可以使用全局增强模块增强方法来允许 TypeScript 识别您期望值string具有format()方法:

/*  here be dragons  */
interface String {
    format(...args: any[]): string;
}
String.prototype.format = function (...args) { return stringFormat(String(this), ...args) };
console.log(myString.format(123, 789)); // page=123&id=789
Run Code Online (Sandbox Code Playgroud)

但希望您会使用其他解决方案之一。


好的,希望有帮助;祝你好运!

游乐场链接