web-dev-qa-db-ja.com

TypeScriptでString.Formatが機能しない

String.FormatTypeScriptでは機能しません。
エラー:

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

簡単にdeclareできます:

interface StringConstructor {
    format: (formatString: string, ...replacement: any[]) => string;
}

String.format('','');

これは、String.formatがdefinedであると仮定しています。例えばMicrosoft Ajax Toolkitの場合: http://www.asp.net/ajaxlibrary/Reference.String-format-Function.ashx

5
basarat

文字列補間

注: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'));

あなたはcouldも考慮します 文字列補間 (テンプレート文字列の機能)、これはECMAScript 6の機能です-それを使用する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を使用せずにデータソースからテンプレート文字列をロードする方法をまだ発見していません。

99
Fenton

-い文字列の連結と退屈な文字列変換を排除することが唯一の目標である場合は、TypeScriptのネイティブ文字列補間を使用できます。

var yourMessage = `Your text ${yourVariable} your text continued ${yourExpression} and so on.`

注:

割り当てステートメントの右側では、区切り文字は一重引用符でも二重引用符でもなく、代わりにbacktickまたはGraveアクセントと呼ばれる特殊文字です。

TypeScriptコンパイラは、右側の特別なリテラルを文字列連結式に変換します。つまり、この構文は、ネイティブのTypeScript機能ではなくECMAScript 6機能に依存していません。生成されたJavaScriptコードは互換性を維持します。

31
g.pickardou

FIDDLE: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

3
seven

このように解決しました。

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");
3
AnandShanbhag

同じ目的を達成する回避策として、 sprintf-js ライブラリと types を使用できます。

別の SOの答え から得た。

0
David Cheung