4

Typescript言語サービスを使用して、Typescriptファイルのシンボルの名前変更を自動化するコマンドラインnodejsツールを作成しています。

ツールに次のように指示します。このタイプのすべてのシンボルの名前をこのシンボルに変更します。resharper と同様に、ローカル変数、プロパティなどの名前も変更します。一度に複数のシンボルの名前を変更できるため、中間の一時的な一意の名前を必要とせずに、2 つのシンボル名を交換することもできます (たとえば、Foo を Bar に、またはその逆に名前を変更します)。

これを機能させるには、PullSymbol 情報を取得できるように、言語サービスのプライベート関数 getSymbolInfoAtPosition を公開する必要がありました。

現在、PullSymbol で getNameAndTypeName を呼び出すことによって、正確な名前と型の一致のみを検出しますが、構造的に互換性のある一致を実行したいと考えています。

C# では、Type に IsAssignableFrom メソッドがあるため、これは簡単です。

Typescript のサービスとしてのコンパイラを使用して、ある PullSymbol が別の PullSymbol と構造的に互換性があるかどうかを検出する方法を知っている人はいますか?

どうもありがとう、ピーター・ヴァースワイベレン

4

2 に答える 2

2

基本的に、あるタイプがリフレクションだけで別のタイプに割り当て可能かどうかを包括的にチェックしているようには見えません。あるタイプが別のタイプに割り当て可能かどうかを確認する機能は、すでに typescript に実装されています。公開されていないだけであり、typescript ライブラリを手動で変更せずに取得する実際の方法はありません。

当面の回避策の 1 つは、アドホックコードを効果的にコンパイルして一方を他方に割り当て、コンパイル エラーがあるかどうかを確認することです。

私の公開リクエストisTypeAssignableToに対する反応は好意的だったので、近いうちに答えが変わることを願っています.

[更新]最終的にマージで公開されたようです...私はまだ試していません:

于 2016-10-28T22:03:42.667 に答える
-1

C# メソッドとの直接の比較がどうなるかはわかりisAssignableFromませんが、おそらく独自のロジックを記述してその関数を作成できます -

isAssignableFrom(pullSymbol): boolean {
    ....
    if (typeof pullSymbol === 'string') {
        // Is compatible with any type that allows strings
    }
    ....
}

ここでいくつかの言語仕様を読んで、次のようなものを見つけることができます。

The Any type is a supertype of all types, and is assignable to and from all types.

ハードコーディングされたロジックでその情報を使用すると、解決策になる場合があります。

于 2014-10-31T14:07:13.230 に答える