webentwicklung-frage-antwort-db.com.de

String.Format funktioniert nicht in TypeScript

String.Format funktioniert nicht in TypeScript.
Error:

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

Sie können es ganz leicht selbst declare

declare module String{
    export var format:any;
}

String.format('','');

Dies setzt voraus, dass String.format an anderer Stelle definiert ist. z.B. in Microsoft Ajax Toolkit: http://www.asp.net/ajaxlibrary/Reference.String-format-Function.ashx

4
basarat

String Interpolation

Anmerkung: Ab TypeScript 1.4 ist die Zeichenfolgeninterpolation in TypeScript verfügbar:

var a = "Hello";
var b = "World";

var text = `${a} ${b}`

Dies wird kompilieren zu:

var a = "Hello";
var b = "World";
var text = a + " " + b;

String-Format

Das JavaScript-Objekt String hat keine format-Funktion. TypeScript wird nicht zu den nativen Objekten hinzugefügt, daher hat es auch keine String.format-Funktion.

Für TypeScript müssen Sie die String-Schnittstelle erweitern und dann eine Implementierung angeben :

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

Sie können dann die Funktion verwenden:

var myStr = 'This is an {0} for {0} purposes: {1}';

alert(myStr.format('example', 'end'));

Sie könnten auch die Interpolation von string (eine Funktion von Template Strings) in Betracht ziehen, die eine ECMAScript 6-Funktion ist. Wenn Sie sie für den Anwendungsfall String.format verwenden möchten, müssen Sie sie dennoch in eine Funktion, um eine unformatierte Zeichenfolge bereitzustellen, die das Format und dann die Positionsargumente enthält. Es wird in der Regel inline mit den Variablen verwendet, die interpoliert werden. Sie müssen also Argumente zuordnen, damit sie für diesen Anwendungsfall funktionieren.

Beispielsweise werden Formatzeichenfolgen normalerweise definiert, um später verwendet zu werden ... was nicht funktioniert:

// 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}`;

Um die Zeichenfolgeninterpolation anstelle einer Formatzeichenfolge zu verwenden, müssen Sie Folgendes verwenden:

function myTemplate(a: string, b: string) {
    var myTemplateString = `This is an ${a} for ${a} purposes: ${b}`;
}

alert(myTemplate('example', 'end'));

Ein anderer häufiger Anwendungsfall für Formatzeichenfolgen ist, dass sie als gemeinsam genutzte Ressource verwendet werden. Ich habe noch keine Möglichkeit entdeckt, eine Vorlagenzeichenfolge aus einer Datenquelle zu laden, ohne eval zu verwenden.

88
Fenton

Sie können die native String-Interpolation von TypeScript verwenden, wenn Sie nur hässliche String-Verkettungen und langweilige String-Konvertierungen vermeiden möchten:

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

HINWEIS: 

Auf der rechten Seite der Zuweisungsanweisung sind die Trennzeichen weder einfache noch doppelte Anführungszeichen, sondern ein special-Char mit dem Namen backtick oder Grave accent.

Der TypeScript-Compiler übersetzt Ihr spezielles Literal auf der rechten Seite in einen String-Verkettungsausdruck. Mit anderen Worten ist diese Syntax nicht auf die ECMAScript 6-Funktion, sondern auf eine native TypeScript-Funktion angewiesen. Ihr generierter Javascript-Code bleibt kompatibel.

26
g.pickardou

FIDDLE:https://jsfiddle.net/1ytxfcwx/

NPM:https://www.npmjs.com/package/TypeScript-string-operations

GITHUB:https://github.com/sevensc/TypeScript-string-operations

Ich habe eine Klasse für String implementiert. Es ist nicht perfekt, aber es funktioniert für mich.

verwenden Sie es, d. h. wie folgt:

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

EDIT:

Ich habe die Klasse erweitert und ein Repository auf Github erstellt. Es wäre schön, wenn Sie mithelfen könnten, es zu verbessern!

https://github.com/sevensc/TypeScript-string-operations

oder laden Sie das npm-Paket herunter

https://www.npmjs.com/package/TypeScript-string-operations

2
seven

Als Workaround, der denselben Zweck erfüllt, können Sie die Typen sprintf-js library und types verwenden.

Ich habe es von einer anderen SO Antwort bekommen.

0
David Cheung

Ich habe es so gelöst;

1.Erstelle eine Funktion

export function FormatString(str: string, ...val: string[]) {
  for (let index = 0; index < val.length; index++) {
    str = str.replace(`{${index}}`, val[index]);
  }
  return str;
}

2. verwendet es wie folgt;

FormatString("{0} is {1} {2}", "This", "formatting", "hack");
0
AnandShanbhag