組み込み型の型定義をtypescriptに拡張することは可能です。例えば、typescriptの外にString.repeat
メソッドがない場合でも、これは作成されます。私は私のいくつかのコードでは、このパターンを適用しようとすると、文字列クラスを拡張するコンテキストでは機能しません
interface String {
repeat(c: number): string;
}
const spaces = " ".repeat(4);
はしかし、私は、ビルドエラーを取得: https://github.com/emmanueltouzery/ng-typeview/blob/c8539fc3403f7e700a023d13655702bdb2113c1b/src/ng-typeview.ts#L18
私が取得:
src/ng-typeview.ts(18,24): error TS2339: Property 'repeat' does not exist on type '" "'.
src/ng-typeview.ts(23,20): error TS2339: Property 'repeat' does not exist on type '" "'.
これは、余分なメソッド行12-14の宣言にもかかわらず。
私はそのクラスのコードを単純化しようとしましたが、機能を破壊するものを分離するまで私の作業サンプルのコードを私の完全なコードに近づけましたが、どこにも行きませんでした。
どうすれば小さなサンプルで余分なインターフェイスが動作しますが、私のアプリケーションには含まれていませんか?私はtsc 2.1.4を使用しています。
EDIT
私は問題をさらに追い詰め。同じファイル内のインターフェースをエクスポートすると、問題の最小再現です:
interface String {
repeat(c: number): string;
}
const spaces = " ".repeat(4);
export interface Anything {
whatever: number;
}
「輸出・インターフェース」と問題消えるから「輸出」を削除します。
EDIT2 今、私の小さなサンプル、余分なインターフェイスでは動作しません。それは少し前にどうしていたのですか?だから私は、 "typescriptがes3ターゲットを保持しているString上でこのメソッドを受け入れることは可能なのでしょうか?"と改定されるかもしれないと思います。 any
にキャストすることは可能ですが、むしろそれを避けることができます。
は '追加export'はあなたのファイルを '外部モジュール'に変換するので、 'String'インターフェースはモジュールスコープになり、グローバルスコープにはなりません。 Nitzanの答えは正しい - グローバルスコープで宣言する必要がある場合は、 'declare global'を使う必要があります。 – artem