web-dev-qa-db-ja.com

Angular2とTypeScript:文字列拡張メソッド/プロトタイプを追加する方法

拡張メソッドformat()Stringに追加したい。したがって、私の期待は、プロジェクトのどこでも_String.format_を使用できることです。私はこれのガイドライン topic に従いましたが、これは助けにはなりません。私はこのエラーを受け取りました: enter image description here

誰か助けてもらえますか?

前もって感謝します。

pS: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はパラメーターを必要としないため

15
jack.pop

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[]をシグネチャに追加しました。これは、関数が引数として任意の数の文字列を期待することをコンパイラに通知します。

7
Nitzan Tomer

私にとって、以下は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';

明らかに、インポート文は正しいパスを指している必要があります。クラスのコンストラクターまたはメソッド内:

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