String.Format не работает в TypeScript
String.Format
не работает в TypeScript
.
Ошибка:
The property 'format' does not exist on value of type
'{ prototype: String; fromCharCode(...codes: number[]): string;
(value?: any): string; new(value?: any): String; }'.
attributes["Title"] = String.format(
Settings.labelKeyValuePhraseCollection["[WAIT DAYS]"],
originalAttributes.Days
);
Ответы
Ответ 1
Вы можете заявить об этом сами довольно легко:
interface StringConstructor {
format: (formatString: string, ...replacement: any[]) => string;
}
String.format('','');
Это предполагает, что String.format определен в другом месте. например, в Microsoft Ajax Toolkit: http://www.asp.net/ajaxlibrary/Reference.String-format-Function.ashx
Ответ 2
Строковая интерполяция
Примечание. Начиная с TypeScript 1.4, интерполяция строк доступна в TypeScript:
var a = "Hello";
var b = "World";
var text = '${a} ${b}'
Это скомпилируется в:
var a = "Hello";
var b = "World";
var text = a + " " + b;
Формат строки
У объекта JavaScript String
нет функции format
. TypeScript не добавляет к собственным объектам, поэтому он также не имеет функции String.format
.
Для TypeScript вам нужно расширить интерфейс String, а затем предоставить реализацию:
interface String {
format(...replacements: string[]): string;
}
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
;
});
};
}
Затем вы можете использовать функцию:
var myStr = 'This is an {0} for {0} purposes: {1}';
alert(myStr.format('example', 'end'));
Вы могли бы также рассмотреть интерполяцию строк (особенность Template Strings), которая является функцией ECMAScript 6 - хотя, чтобы использовать ее для String.format
использования String.format
, вам все равно нужно будет обернуть ее в функцию, чтобы предоставить необработанную строку содержащий формат, а затем позиционные аргументы. Как правило, он используется в потоке с переменными, которые интерполируются, поэтому вам нужно отобразить с помощью аргументов, чтобы он работал для этого варианта использования.
Например, строки формата обычно определяются для использования позже... что не работает:
// Works
var myFormatString = 'This is an {0} for {0} purposes: {1}';
// Compiler warnings (a and b not yet defines)
var myTemplateString = 'This is an ${a} for ${a} purposes: ${b}';
Поэтому для использования строковой интерполяции, а не форматной строки, вам необходимо использовать:
function myTemplate(a: string, b: string) {
var myTemplateString = 'This is an ${a} for ${a} purposes: ${b}';
}
alert(myTemplate('example', 'end'));
Другим распространенным случаем использования строк формата является то, что они используются в качестве общего ресурса. Я еще не нашел способ загрузки строки шаблона из источника данных без использования eval
.
Ответ 3
Вы можете использовать внутреннюю интерполяцию TypeScript в том случае, если ваша единственная цель - устранить уродливые конкатенации строк и скучные преобразования строк:
var yourMessage = 'Your text ${yourVariable} your text continued ${yourExpression} and so on.'
НОТА:
В правой части оператора присваивания разделители не являются ни одинарными, ни двойными кавычками, а специальным символом, называемым обратным тоном или серьезным акцентом.
Компилятор TypeScript преобразует ваш специальный литерал справа в выражение объединения строк. Другими словами, этот синтаксис не опирается на функцию ECMAScript 6, а не на встроенную функцию TypeScript. Ваш сгенерированный код JavaScript остается совместимым.
Ответ 4
Я решил это так;
1. Создал функцию
export function FormatString(str: string, ...val: string[]) {
for (let index = 0; index < val.length; index++) {
str = str.replace('{${index}}', val[index]);
}
return str;
}
2. Используется как следующее;
FormatString("{0} is {1} {2}", "This", "formatting", "hack");
Ответ 5
Скрипка: https://jsfiddle.net/1ytxfcwx/
NPM: https://www.npmjs.com/package/typescript-string-operations
GITHUB: https://github.com/sevensc/typescript-string-operations
Я реализовал класс для String. Это не идеально, но это работает для меня.
используйте его, например, так:
var getFullName = function(salutation, lastname, firstname) {
return String.Format('{0} {1:U} {2:L}', salutation, lastname, firstname)
}
export class String {
public static Empty: string = "";
public static isNullOrWhiteSpace(value: string): boolean {
try {
if (value == null || value == 'undefined')
return false;
return value.replace(/\s/g, '').length < 1;
}
catch (e) {
return false;
}
}
public static Format(value, ...args): string {
try {
return value.replace(/{(\d+(:.*)?)}/g, function (match, i) {
var s = match.split(':');
if (s.length > 1) {
i = i[0];
match = s[1].replace('}', '');
}
var arg = String.formatPattern(match, args[i]);
return typeof arg != 'undefined' && arg != null ? arg : String.Empty;
});
}
catch (e) {
return String.Empty;
}
}
private static formatPattern(match, arg): string {
switch (match) {
case 'L':
arg = arg.toLowerCase();
break;
case 'U':
arg = arg.toUpperCase();
break;
default:
break;
}
return arg;
}
}
РЕДАКТИРОВАТЬ:
Я расширил класс и создал репозиторий на github. Было бы здорово, если бы вы могли помочь улучшить его!
https://github.com/sevensc/typescript-string-operations
или скачайте пакет npm
https://www.npmjs.com/package/typescript-string-operations
Ответ 6
В качестве обходного решения, которое достигает той же цели, вы можете использовать библиотеку sprintf-js и types.
Я получил его из другого SO-ответа.
Ответ 7
Я использую версию TypeScript 3.6
и могу сделать это следующим образом:
let templateStr = 'This is an {0} for {1} purpose';
const finalStr = templateStr.format('example', 'format'); // This is an example for format purpose