TypeScript IDEの型推論がまだ適当なのかもしれない

最近TypeScriptを触り始めた私です。

ちょっとわかりづらかったことがあったのでメモ的に書いておきます。

私はIDEはPHPStormを使っていて、バージョンはPhpStorm 2023.2.4です。
PHPStormで設定しているTypeScriptのバージョンは5.1.3です。
Nodeのtscのバージョンは5.0.4です。

さてさて、次のようなTypeScriptがあるときに

    class Person {
      constructor(public name: string, public ramen?:string) { }
      talk() {
        console.log('最近どうですか?')
      }
      setRamen(ramen: string) : Person{
        this.ramen = ramen
        return this
      }
      build():Person {
        return this
      }
    }

    class Kyushujin extends Person {
      talk() {
        console.log('最近はなんばしよっとね?')
      }
      build():Kyushujin {
        return this
      }
    }

    const kyushujin =  new Kyushujin('太郎')
        .setRamen('とんこつ')
        .build()

    if(kyushujin instanceof Kyushujin) {
      console.log('九州人です')
    }

    kyushujin.talk()

実行結果は下記の通りです。

ちゃんとインスタンスkyusyujinは”Kyushujin”として認識されていますが、new Kyushujin の部分でIDEがしてくれる型推論は 下記のスクショのようにスーパータイプのPersonなんですよね。

PHPStormのスクショ① const kyushujin:Personとなっている

エッ ってなりましたね。TypeはKyushujinとして表示されるべきだと思ったからです。

これ、setRamen() で 戻り値の型が Personになってるからみたいで setRamen()をコメントアウトすると、Kyushujinとして推論してくれます。

PHPStormのスクショ② const kyushujin:Kyushujin となっている

実行結果は上記と一緒です。

一瞬、あれ?サブタイプにちゃんとなってないじゃん!って思って焦りました。

あんまりまだわかってないことが多いので、まだまだ勉強中です。(´ω`)

ちなみに余談で、弊社ではGithub Copilot 使ってますが、下記までタイプしたところで

    const kyushujin =  new Kyushujin('太郎')
        .setRamen(
 .setRamen('とんこつ')

って勝手にコパイロットくんが入れてくれたんですよ!!!

すごくないですか???Σ(゚Д゚)スゲェ!!

九州人のラーメンは ‘とんこつ’ を set する

を生成できるところまで来てるんですね。(`・ω・´)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です