Angular2 和 Typescript:如何添加字符串扩展 method/prototype

Angular2 & Typescript: How to add string extension method/prototype

我想将扩展方法 format() 添加到 String。所以我的期望是我可以在我的项目中的任何地方使用 String.format 。 我遵循了此 topic 的指导方针,但这无济于事。我收到此错误:

谁能帮帮我?

提前致谢。

p.s: 我想像在 angular 1.xx

中那样添加扩展方法


编辑

使用declare global不会出错。

declare global {
interface String {
    format(): string;
}}

String.prototype.format = function () :string {
var result = arguments[0];
for (var i = 0; i < arguments.length - 1; i++) {
    var reg = new RegExp("\{" + i + "\}", "gm");
    result = result.replace(reg, arguments[i + 1]);
}
return result;}

我们如何使用String.format('<img alt="{0}" title="{0}" src="{1}" />', name, id); 由于format不需要参数

基于 this playground 它工作得很好。

它可能对您不起作用,因为您可能正在使用模块 (import/export),在这种情况下,您需要在 global augmentation:

中执行此操作
declare global {
    interface String {
        foo(): number;
    }
}

那么在原型中添加foo就不会报错了。


编辑

您似乎想要 String 上的静态函数,因此您需要这样做:

declare global {
    interface StringConstructor {
        format(): string;
    }
}

String.format = function (...args: string[]) {
    ...
}

我还在签名中添加了 ...args: string[],它告诉编译器该函数需要任意数量的字符串作为参数。

对我来说,以下是使用 TypeScript 2.8.4 在 Angular 6 项目中工作的。

在 typings.d.ts 文件中添加:

interface String {
  format(...args: string[]): string;
}

注意:不需要'declare global'。

在名为 string.extensions.ts 的新文件中添加以下内容:

interface String {
  format(...args: string[]): string;
}

String.prototype.format = function (...args: string[]): string {
  var s = this;
  return s.replace(/{(\d+)}/g, function (match, number) {
    return (typeof args[number] != 'undefined') ? args[number] : match;
  });
};

要使用它,首先导入它:

import '../../string.extensions';

显然您的导入语句应该指向正确的路径。 在 class 的构造函数或任何方法中:

console.log("Hello {0}".format("world"));