Подтвердить что ты не робот

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
);
4b9b3361

Ответ 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