Считается плохой практикой модифицировать собственные прототипы, такие как 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
, но, надеюсь, вы это сделаете используйте одно из других решений.
Хорошо, надеюсь, это поможет; удачи!
ссылка на игровую площадку