String.Format 在 TypeScript 中不起作用

IT技术 javascript string typescript string-formatting
2021-03-14 16:05:12

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
);
6个回答

字符串插值

注意:从 TypeScript 1.4 开始,TypeScript 中可以使用字符串插值:

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

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

这将编译为:

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

字符串格式

JavaScriptString对象没有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'));

可能还考虑串插,这是一个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.

@YannDuran 我已经改写了第一句话,以试图让它在人们只想单独阅读部分内容时仍然有效。JavaScript 中确实存在模板字符串在编译器为旧目标添加 polyfill 的情况下,它仍然不会添加到本机对象 - 它内联更改,或者(很少)添加一个特殊命名的函数。模板字符串不能满足String.format.
2021-04-18 16:05:12
我没有说任何关于在 TypeScript 中扩展的任何本机对象,我说你写的陈述是不正确的。Type Script 是Javascript超集,因此 TypeScript 中存在许多 Javascript 中不存在的构造。“在 1.4 版本中,TypeScript 现在支持 ES6 模板字符串,还可以将它们编译为 ES3/ES5 表达式”如果 string.format 达到相同的结果,您将使用它。
2021-04-27 16:05:12
@YannDuran 你能给我举一个在 TypeScript 中扩展的原生对象的例子吗?该声明指出,在运行时您将调用与String使用 JavaScript 的人完全相同的对象。
2021-05-09 16:05:12
@YannDuran 关键字是“本机”。如果你抛开他说的重点,然后说你是对的,也许你是对的,但这与他所说的无关。我喜欢放风筝。我喜欢飞行……看到区别了吗?
2021-05-09 16:05:12
“JavaScript(因此 TypeScript)没有原生 String.Format 函数”——这实际上是不正确的。TypeScript 中存在许多JavaScript 中不存在的东西(然而,你所说的正好相反)
2021-05-13 16:05:12

如果您的唯一目标是消除丑陋的字符串连接和无聊的字符串转换,则可以使用TypeScript 的本机字符串插值

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

笔记:

在赋值语句的右侧,分隔符既不是单引号也不是双引号,而是一个称为反引号或重音符号特殊字符

TypeScript 编译器会将您右侧的特殊文字转换为字符串连接表达式。换句话说,此语法不依赖于 ECMAScript 6 功能,而是原生 TypeScript 功能。您生成的 javascript 代码保持兼容。

在我看到您关于特殊刻度线的注释并意识到我做错了什么之前,我无法长时间使用字符串插值。
2021-04-22 16:05:12

你可以很容易地自己声明它:

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

String.format('','');

这是假设 String.format 在别处定义的例如在 Microsoft Ajax 工具包中:http : //www.asp.net/ajaxlibrary/Reference.String-format-Function.ashx

无法重新声明块范围变量“String”。
2021-04-18 16:05:12
String在 lib.d.ts 中已经有一个接口,所以你可以在接口打开时扩展它。
2021-04-19 16:05:12

我是这样解决的;

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");
好的,但如果您想在字符串的多个位置重用相同的值,则行不通。例如,您不能这样做:FormatString("{0} is happy because {0} solved his problem", "jeremy");将省略第二个占位符。
2021-04-17 16:05:12

小提琴: 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

任何plunker或小提琴?
2021-04-18 16:05:12
很棒的工作,这是我需要的一切的一站式商店。但是,这仅与 webpack 2.2.0 兼容,而我使用的是 3.3.0。
2021-04-20 16:05:12
干得好,已经在使用你的包,做了一些修改。
2021-05-03 16:05:12