拡張メソッドformat()
をString
に追加したい。したがって、私の期待は、プロジェクトのどこでも_String.format
_を使用できることです。私はこれのガイドライン topic に従いましたが、これは助けにはなりません。私はこのエラーを受け取りました:
誰か助けてもらえますか?
前もって感謝します。
pS: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 に基づくと、問題なく動作します。
おそらくモジュール(インポート/エクスポート)を使用しているため、おそらく機能しません。その場合は 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;
}
注:「グローバル宣言」する必要はありません。
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"));