[本のメモ] 手を動かしながら学ぶTypeScript - セクション3
技術書を学ぶときにスクラップを使ってメモしていくのを試してみる。途中まで読んじゃったけど今日は表題にある本のメモ。p121〜
TSではclassのコンストラクタの仮引数にreadonlyをつけてあげると、classのプロパティに自動でセットしてくれる様になる。この辺少しややこしいと感じるのが、Swiftだとinitの自動生成などプロパティの定義から実装が生成されるのに対して、TSは実装の部分で省略が多い印象がある。
class Person {
constructor(readonly name: string, readonly age: number) {}
}
const cities = ['Tokyo', 'Chiba'] as const
const City = typeof cities[number] // 'Tokyo' | 'Chiba'
上記の様な値から型を作り出す方法が結構書いてあるけど、逆にユニオン型からそれぞれの型に応じた値の配列を作る方法はどうやるんだろ?
SwiftのenumのrawValueやCaseIteratable的な
nullの場合のassertの書き方はこんな感じ?
if(!nullableValue) throw new Error('error')
「どんな文字列でもキーとなるオブジェクト」を表現するためのインデックスシグネチャ。
type Songs = {
[key: string]: {length: number}
}
const songs: Songs = {
"sample1": {length: 1},
"sample2": {length: 1},
"sample3": {length: 1},
}
けどどんな文字列良いので、例えば songs.unknownKey.length
としてもコンパイルエラーにならない
上記を解決するためのMapped Types
ユニオン型からオブジェクトのkey一覧を生成できる
type Song = 'sample1' | 'sample2' | 'sample3'
type Songs = {
[key in Song]: {length: number}
}
const songs: Songs = {
'sample1': {length: 1},
'sample2': {length: 2},
'sample3': {length: 3},
}
console.log(songs.sample1.length)
console.log(songs.unknown.length) // コンパイルエラーになる
抽象クラスとinterfaceは普通にあるみたいだ。
プロトコル志向の方が好きな自分からするとinterfaceで書いていきたいけど、swiftみたいにプロトコルのデフォルト実装は流石にかけないかな...?
同じ実装を一つの場所で定義したい場合は抽象クラスを使うしかないのかな
とりあえずChapture03読了。
モジュール化の説明がなかったので、それだけ試しておくか
例えば本書だとgameTitleというシンボル配列の値からユニオン型を生成して、そのユニオン型からMapped Typesを使用してオブジェクトの型を作ってる訳だけど、何も考えずに分ける下記のようになる。
export const gameTitles = ['hit and blow', 'janken'] as const
export type GameTitle = typeof gameTitles[number]
export type GameStore = {
[key in GameTitle]: Game
}
これが普通なのかな? なんとなく値は実装寄りだから、型を使う方で定義したいんだけど、型を値から作ってる時点でそれは難しそうかしら。
型は型だけ宣言できると嬉しいなと思うんだけども。
pushしたらなんかフォーマットが不思議な感じになってたのでフォーマッター入れてみる。
Prettierで良さそう。
下記記事を参考に入れてみる。
とりあえずできた
[スクラップの感想]
うん、このスクラップなんだか良さそう。
Notionとかでやっても別に良いんだけど、Twitterみたいに細切れに書いていけるのは、一つ一つのタスクが小さくて性に合ってそう。
書いたやつが一応そのまま公開もされるから、今年の目標の発信力の向上にも役に立ちそう
(まぁこれは自分の頭の悪さみたいのも露呈するよう + 質の低いネットコンテンツの量産で敬遠してた主な理由でもあるんだけど)
どうでも良いけど、こういう形式で技術に関係ない読書メモができるサービスあったら良いなと思った。というかあるのかな? Twitterでやれよって感じかもしれないけど。