わーいtype あかりtypeだいすき
昨日の日記(12021年3月13日)です。天気は晴れ。電波は弱い。
わーいtype あかりtypeだいすき
TS少しずつ分かってきました。
かなり怪レいサイトを見つけた pic.twitter.com/tWCV1l552T
— skytomo🌒 (@skytomo221) 2021年3月12日
TypeScriptのインターフェイスとクラスの違いというか、どっちを使えばいいかわからないんですが、調べても出てこない…
— skytomo🌒 (@skytomo221) 2021年3月12日
これ元の記事が中国語っぽいんだけど、まさか英語圏の人が「日本語に機械翻訳したけど、漢字が残ってるな…せや!残った漢字は消したろ!」とかしていないでしょうね……
— skytomo🌒 (@skytomo221) 2021年3月12日
一番大きな違いは、コンパイル後に残るか残らないかかな (インターフェースは残らない)。
— Ziphil τὸ Aἰλουροκύνικλον 🐱🐰 (@Ziphil) 2021年3月12日
classはJSの構文なのでコンパイルしてもそのまんまで、interfaceはTSの型の定義の仕方なのでコンパイルすると消える
— へだる (@hedalu244) 2021年3月12日
機能としてはclassはコンストラクタになるけどinterfaceは別途そういうのを書かなきゃいけない(オブジェクトリテラルとかで済ませられるなら書かないという選択もある)
用途次第かなーと思います。
— りこ🍥 (@Lycolia) 2021年3月12日
基本interfaceは複数のclassに同じ要素をもたせるのに使うものなので、classの代替にはなりません。
classはインスタンスを生やして状態を共有するオブジェクトを作るのが目的です。
もし型を定義したいだけならtypeがオススメです。
「機能としてはclassはコンストラクタになるけどinterfaceは別途そういうのを書かなきゃいけない」とは、classにはコンストラクタがあるが、interfaceにはそれがない、という意味でいいですか?
— skytomo🌒 (@skytomo221) 2021年3月13日
例えば、べたるさんのswap-knightではBoardをinterfaceとして定義して、createBoardという関数でBoardを実装したオブジェクトリテラルを返していますね。https://t.co/QkCIhhpRKx
— skytomo🌒 (@skytomo221) 2021年3月13日
これは完全に流派ですね……
— へだる (@hedalu244) 2021年3月13日
このプロジェクトはオブジェクト指向ではなく関数型で書こうとしたので、すべてのパラメータをreadonlyにしていて、駒を動かすような関数も盤面を直接書き換えるのではなく動かした後の盤面を返す関数として表現しています。
classで書いても同じことはできるはずですが、気分の問題としてclassで書くとオブジェクト指向をしている感じになってしまうので…
— へだる (@hedalu244) 2021年3月13日
それとJavascriptのclass自体がある種の形式の関数の糖衣構文なので、ポリモーフィズムとかを使わない限り関数で書いた方が分かりやすいかなというのもあります
昨日、寝る前に色々調べたけど、一日で解決できるようなものじゃなかったわね
— skytomo🌒 (@skytomo221) 2021年3月13日
「TypeScriptのclassは暗黙のうちにinterfaceを定義しているのと同義」とかこういう記事を見ていたhttps://t.co/HimduO0FTB
— skytomo🌒 (@skytomo221) 2021年3月13日
クラスとインターフェスもそうだけど、インターフェースとタイプエイリアスの違いはなんかもっとよく分からない。
— Ziphil τὸ Aἰλουροκύνικλον 🐱🐰 (@Ziphil) 2021年3月13日
TSのclass、型としてはinterfaceと差がないのかな(newを通さなずにオブジェクトリテラルで作っても代入できるのでinstanceofとかは保証してくれない?)
— へだる (@hedalu244) 2021年3月13日
そもそもこの疑問が湧いた発端が、OTM-JSONを読み込むライブラリを作っていたときにclassじゃないとinstanceofが使えないのかー、だったので、まさに、です。
— skytomo🌒 (@skytomo221) 2021年3月13日
あー、それはそう(instanceofによって処理を分岐するとかは当然JSで区別できるものでないといけないのに対して、interfaceなどはコンパイルで消える注釈でしかないので)
— へだる (@hedalu244) 2021年3月13日
やっぱり、TypeScriptがAltJSである限り、コンパイル後にどうなるかを意識していないといけないんですかね
— skytomo🌒 (@skytomo221) 2021年3月13日
悲しい負債 (JSを負債と言うな)。
— Ziphil τὸ Aἰλουροκύνικλον 🐱🐰 (@Ziphil) 2021年3月13日
TypeScriptのインターフェースの命名規則、とあるQiita記事に倣ってプレフィックスにIを付けていたのですが、付けないほうがいい?
— skytomo🌒 (@skytomo221) 2021年3月13日
先頭にIを付けるといい理由ってあるんですか?
— skytomo🌒 (@skytomo221) 2021年3月13日
あれは所謂ハンガリアン記法ですが、公式ではやめておきましょうだったはずです
— Ryokohbato (@ryokohbato) 2021年3月13日
公式ではないですが、こういうのを見つけたので、たしかに付けないほうがいいみたいですねhttps://t.co/2Cqp9cB57m
— skytomo🌒 (@skytomo221) 2021年3月13日
すいません、公式で禁止されているというレベルではないようです
— Ryokohbato (@ryokohbato) 2021年3月13日
特別にチームで定めた理由等がないならやめましょうという方針みたいですhttps://t.co/DNUAvcf2Wq
私は付ける意味全くないと思ってるので付けない。
— Ziphil τὸ Aἰλουροκύνικλον 🐱🐰 (@Ziphil) 2021年3月13日
これはコーディング規約にプリフィックス付けるなというのがあった気がします
— 生産性 (@kantarow_) 2021年3月13日
付けるのやめるか…
— skytomo🌒 (@skytomo221) 2021年3月13日
何気に「ハンガリアン記法」とか「オブジェクトリテラル」とかいうワードを知らなかった(過去に知っていたとしても忘れていた)
— skytomo🌒 (@skytomo221) 2021年3月13日
ちょろっとHsjoihsさんのリポジトリを見てみたけどそもそもinterfaceを使っていなかった(Ziphilさんと同じだ?)
— skytomo🌒 (@skytomo221) 2021年3月13日
少し寄り道してるけどinterfaceだとこんな感じで書けるのね pic.twitter.com/YNcxe13nPM
— skytomo🌒 (@skytomo221) 2021年3月13日
色々とリプライをもらって分かってきました、ありがとうございます。
— skytomo🌒 (@skytomo221) 2021年3月13日
へだるさん、Ziphilさん、りこさん、Ryokohbatoさん、他に教えてくれた方、ありがとうございます!
最終的な解決
僕が求めていたのはtypeでした!
— skytomo🌒 (@skytomo221) 2021年3月13日
わーいtype あかりtypeだいすき
— skytomo🌒 (@skytomo221) 2021年3月13日
最終的には type を使うのが正解っぽかったです。
Duolingo
30日連続達成しました! うっかりスクショし忘れました。
癖で Win + Shift + S してしまう。 Win + PrintScreen だっつーの。
ちなみに英語をしました。
nipponjo
電話をしました。
僕がDuolingoで英語をしました。 その後、HsjoihsさんがDuolingoやってました。(相互フォローになりました!)
23時30分~26時くらいまでりんさんがAnkiでN1のデッキカードの整理をする会を見ました。 初めてmuさんと話しました。日本語上手かったです。 キュウリくんも通話に入って4人でわちゃわちゃしました。