Angular2&打字稿:如何添加字符串扩展方法/原型

时间:2017-04-27 02:16:04

标签: angular typescript extension-methods

我想将扩展方法format()添加到String。所以我的期望是我可以在我的项目中的任何地方使用String.format。 我遵循了topic的指导原则,但这没有用。我收到了这个错误: enter image description here

任何人都可以帮助我吗?

提前致谢。

p.s:我想像我在angular 1.xx中所做的那样添加扩展方法

enter image description here

修改

使用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不需要参数

2 个答案:

答案 0 :(得分:6)

基于this playground,它的工作正常。

它可能不适合您,因为您可能正在使用模块(导入/导出),在这种情况下,您需要在global augmentation中执行此操作:

declare global {
    interface String {
        foo(): number;
    }
}

然后,在向原型添加foo时,您不会收到错误。

修改

好像你想在String上使用静态函数,所以你需要这样做:

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

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

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

答案 1 :(得分:4)

对我来说,以下内容使用TypeScript 2.8.4在Angular 6项目中进行了工作。

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

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

注意:无需“声明全局”。

在名为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';

很显然,您的import语句应指向正确的路径。 在类的构造函数或任何方法中:

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