Closed13

[本のメモ] 手を動かしながら学ぶTypeScript - セクション3

hiroc19hiroc19

技術書を学ぶときにスクラップを使ってメモしていくのを試してみる。途中まで読んじゃったけど今日は表題にある本のメモ。p121〜

hiroc19hiroc19

TSではclassのコンストラクタの仮引数にreadonlyをつけてあげると、classのプロパティに自動でセットしてくれる様になる。この辺少しややこしいと感じるのが、Swiftだとinitの自動生成などプロパティの定義から実装が生成されるのに対して、TSは実装の部分で省略が多い印象がある。

class Person {
  constructor(readonly name: string, readonly age: number) {}
}
hiroc19hiroc19
const cities = ['Tokyo', 'Chiba'] as const
const City = typeof cities[number] // 'Tokyo' | 'Chiba'

上記の様な値から型を作り出す方法が結構書いてあるけど、逆にユニオン型からそれぞれの型に応じた値の配列を作る方法はどうやるんだろ?
SwiftのenumのrawValueやCaseIteratable的な

hiroc19hiroc19

nullの場合のassertの書き方はこんな感じ?

if(!nullableValue) throw new Error('error')
hiroc19hiroc19

「どんな文字列でもキーとなるオブジェクト」を表現するためのインデックスシグネチャ。

type Songs = {
  [key: string]: {length: number}
}
const songs: Songs = {
  "sample1": {length: 1},
  "sample2": {length: 1},
  "sample3": {length: 1},
}

けどどんな文字列良いので、例えば songs.unknownKey.length としてもコンパイルエラーにならない

hiroc19hiroc19

上記を解決するための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) // コンパイルエラーになる
hiroc19hiroc19

抽象クラスとinterfaceは普通にあるみたいだ。
プロトコル志向の方が好きな自分からするとinterfaceで書いていきたいけど、swiftみたいにプロトコルのデフォルト実装は流石にかけないかな...?
同じ実装を一つの場所で定義したい場合は抽象クラスを使うしかないのかな

hiroc19hiroc19

とりあえずChapture03読了。
モジュール化の説明がなかったので、それだけ試しておくか

hiroc19hiroc19

https://js.studio-kingdom.com/typescript/handbook/modules
を参考にモジュール分割してみたんだけど、値から型を生成する場合ってどういう風にファイル分ければ良いんだろう?
例えば本書だと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
}

これが普通なのかな? なんとなく値は実装寄りだから、型を使う方で定義したいんだけど、型を値から作ってる時点でそれは難しそうかしら。
型は型だけ宣言できると嬉しいなと思うんだけども。

hiroc19hiroc19

[スクラップの感想]
うん、このスクラップなんだか良さそう。
Notionとかでやっても別に良いんだけど、Twitterみたいに細切れに書いていけるのは、一つ一つのタスクが小さくて性に合ってそう。
書いたやつが一応そのまま公開もされるから、今年の目標の発信力の向上にも役に立ちそう
(まぁこれは自分の頭の悪さみたいのも露呈するよう + 質の低いネットコンテンツの量産で敬遠してた主な理由でもあるんだけど)

hiroc19hiroc19

どうでも良いけど、こういう形式で技術に関係ない読書メモができるサービスあったら良いなと思った。というかあるのかな? Twitterでやれよって感じかもしれないけど。

このスクラップは2022/01/01にクローズされました