2016-12-16 4 views
0

組み込み型の型定義を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にキャストすることは可能ですが、むしろそれを避けることができます。

+1

は '追加export'はあなたのファイルを '外部モジュール'に変換するので、 'String'インターフェースはモジュールスコープになり、グローバルスコープにはなりません。 Nitzanの答えは正しい - グローバルスコープで宣言する必要がある場合は、 'declare global'を使う必要があります。 – artem

答えて

2

あなたがrepeatメソッドは、それがes6を標的とすることによって、そうdefined in lib.es6.d.tsでどのようにこれまでに、文字列のために定義されていないes5をターゲットにする場合、コンパイラはそれを見つけるでしょう。あなたはこれを試して、それを自分で追加したい場合は

lib: ["es6"]

を:あなたはes6をターゲットにすることができない場合

は、あなたはまだcompiler optionsでそれを指定することによって、それはlibのだ使用することができます

declare global { 
    interface String { 
     repeat(c: number): string; 
    } 
} 
+0

それだけです!記録のために。私はnodejs(私のマシン上の6.2.2)をターゲットにしています。私はノード上に完全なES6を実際に得ることができるかどうかはわかりません。私はそうは思わない。しかし、私はString.repeatを得ることができます、それは私がそれをテストして動作します。すでに依存している '@ types/node'にも存在しません。 –

+0

私はlib:es6を追加して、関数が実際にノードに実装されていないとランタイムエラーが発生するのを恐れています。関数を追加するほうが安全だと思います。 –

+0

@EmmanuelTouzery入力用のcliツールを使用してnode.js 6.9の.d.tsファイルを作業領域に入れることができるはずです。それは助けるかもしれません。 – Catalyst

1

あなたが扱っている特定のエラーは、あなたのtsconfigの目標値から来ていると思います。私がes6を対象とするときに.repeatが存在するとき、es5を実行するときにはそれはしません。

文字列型の定義に行くと、typescriptが使用している宣言が表示されます。 tsconfigに応じて、おそらくlib.d.tsまたはlib.es5.d.tsまたはlib.es6.d.ts(またはその他のもの)です。

+0

私はそうは思わない:私はそれを再現し、同じtsconfigで作業していない。私の小さなサンプルは、私のアプリと同じtsconfigで動作しました。また、私は問題を示している小さなサンプルを見つけることができた、私の質問を更新しました。 –

+0

ええと今、私は完全に混乱しています。今では私のオリジナルの「いつも働いているサンプル」でさえ、私のためにはもう働きません。あなたが言ったように、es6ターゲットを選択すると、余分なインターフェースがなくても動作するようになります。余分なインターフェースを追加すると、es3ターゲットを強制することさえできます。 –

+0

遅れて申し訳ありませんが、Nitzanはそれが正しいと思います。しかし、文字列では文字列と文字列は実際には同じではありません。 – Catalyst

関連する問題