Typescript String.format не существует - PullRequest
0 голосов
/ 27 января 2020

У меня есть строка const, где я должен заменить два слова, например:

public static readonly MY_STRING: string = 'page={0}&id={1}';

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

, но когда я делаю String.format, это говорит мне

Property 'format' does not exist on type 'String'

Что является правильным способом использовать интерполяцию / замену строк в этом случае? С форматом я бы сделал что-то вроде этого:

 MY_STRING.format(page, id)

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Считается плохой практикой модифицировать собственные прототипы, такие как String. Поскольку в JavaScript нет стандартного или согласованного format() метода для строк, добавление собственного может привести к неожиданному поведению в любом коде, который выполняется в той же среде выполнения. Ваша реализация даже сначала проверяет существующий String.prototype.format, что означает, что если кто-то сначала доберется с другой реализацией, то you может оказаться с неожиданным поведением.

Нет ничего плохого в том, чтобы просто использовать функцию 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

Кроме того, JavaScript имеет литералы шаблона , которые обеспечивают практически те же функции:

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

Если вы намереваетесь изменить прототип 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

, но, надеюсь, вы это сделаете используйте одно из других решений.


Хорошо, надеюсь, это поможет; удачи!

ссылка на игровую площадку

0 голосов
/ 27 января 2020

Вы можете дополнить объявление строки из базовой библиотеки:

declare global {
    interface String {
        format(...args: []): string
    }
}

Playground Link

Примечание: если не в модуле, declare global не обязательно, вы можете просто переместить interface String {...} на верхний уровень ( Playground Link )

...