概要
IntelliJ IDEA をメインで使っていますが、「使用箇所の検索(Ctrl+B)」を多用しています。
Typescript を書いていて、ファンクションやメソッドの検索の仕様がわからなくなったので整理しました。
特に継承したクラスや型変換して実行するときの取り扱いについてまとめます。
ついでに、Visual Studio Codeと比較しています。
なお、本記事の正確性や完全性について保証しませんので、ご注意ください。
まとめ
- superクラス側で「使用箇所の検索」すると、継承クラス側の使用箇所まで検索される。
- 継承クラス側の「使用箇所の検索」では、superクラスや、他の継承クラスの使用箇所は検索されない(対象の継承クラスの検索対象だけ検索される)。
- any型にしてしまうと「使用箇所の検索」では、一切で検索できない(any型はやめよう)
- Visual Studio Code は、superクラス, 継承クラスともに関係なく検索される。(継承クラス側の使用箇所のみの検索はできない *メインで使ってないのでできたら教えてください)
- Visual Studio Code の「すべての出現個所を検索」はIntelliJ IDEA ではできない。 -> 一応複数ファイル内検索(Ctrl+Shift+F)で代替可能。
検証
検証コードをもとに色々な実装パターンで検索を試して、どのパターンが検索対象となるかを確認します。
検証コード
TestCode.ts
export class SuperA {
public testA(): string {
return "HOGE";
}
}
export class A extends SuperA {
testA(): string {
return "HOGEHOGE";
}
}
export class B extends SuperA {
testA(): string {
return "HOGEHOGEHOGE";
}
}
export class Main {
main(): void {
// パターン1. 継承クラスAのtestAを実行
new A().testA();
// パターン2. 親クラスSuperAのtestAを実行
new SuperA().testA()
// パターン3. Aをany型に入れ、testAを実行
let ta: any = new A();
ta.testA();
// パターン4. SuperAをA型に入れ、testAを実行
let tb: A = new SuperA();
tb.testA()
// パターン5. AをSuperAにキャストしてtestAを実行
let tc:A = new A();
(tc as SuperA).testA();
// パターン6. Aを型定義なしで作成後、testAを実行
let td = new A();
td.testA();
// パターン7. 型定義なしで変数を作成後、Aを代入してtestAを実行
let te;
te = new A();
te.testA()
// 8. Main(継承関係がない)のtestAを実行
this.testA();
}
testA(): string {
return "HUGA";
}
}
new Main().main();
検索の実行
- superAクラスのtestAメソッドの使用箇所を検索(Ctrl+B)
- 検索結果 パターン1,2,4,5,6
- superAのtestAメソッドの使用箇所に加えて、継承クラス(A,B)のtestAメソッドの使用箇所も検索される。
- any型として認識されているパターン3,7、関係がないtestAメソッドの使用(パターン8)は検索されない。
- 継承クラスAのtestAメソッドの使用箇所を検索(Ctrl+B)
- 検索結果 パターン1,4
- 継承クラス(A)のtestAメソッドの使用箇所のみが検索される。
- superクラスのtestAメソッドの使用箇所(2,5,6)、any型として認識されている使用箇所(パターン3,7)、関係がないtestAメソッドの使用箇所(パターン8)は検索されない。
結果
- superクラス側で検索すると継承クラス側の使用箇所まで検索される。
- 継承クラス側での検索では、superクラスやほかの継承クラスの使用箇所は検索されない。
- any型にしてしまうと使用箇所の検索では一切で検索できなくなる。-> 当たり前だがany型を使うのはやめよう。
- 基本的にはtypescriptの型認識に従う(asによる型アサーション等に対応)。
Visual Studio Code との比較
- Visual Studio Code は、superクラス, 継承クラスともに関係なく検索される。(継承クラス側の使用箇所のみ検索できない)
- Visual Studio Code の「すべての出現個所を検索(パターン1~8のすべてを検索)」はできない -> 複数ファイル内検索(Ctrl+Shift+F)で対応可能 。
商標
- IntelliJ IDEAは、JetBrains社またはその関連会社の商標です。
- Visual Studio Code およびMicrosoft社の各種サービスは、Microsoft Corporationまたはその関連会社の商標です。
- 記載の会社名、製品名、サービス名等はそれぞれの会社の商標または登録商標です。