最近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なんですよね。
エッ ってなりましたね。TypeはKyushujinとして表示されるべきだと思ったからです。
これ、setRamen() で 戻り値の型が Personになってるからみたいで setRamen()をコメントアウトすると、Kyushujinとして推論してくれます。
実行結果は上記と一緒です。
一瞬、あれ?サブタイプにちゃんとなってないじゃん!って思って焦りました。
あんまりまだわかってないことが多いので、まだまだ勉強中です。(´ω`)
ちなみに余談で、弊社ではGithub Copilot 使ってますが、下記までタイプしたところで
const kyushujin = new Kyushujin('太郎')
.setRamen(
.setRamen('とんこつ')
って勝手にコパイロットくんが入れてくれたんですよ!!!
すごくないですか???Σ(゚Д゚)スゲェ!!
九州人のラーメンは ‘とんこつ’ を set する
を生成できるところまで来てるんですね。(`・ω・´)