「TypeScriptの型入門」で手を動かす - その5
本日は「タプル型」から手を動かします。
タプル型
タプルとは?
pythonとかではa=(1,2)
みたいに、順序をもつ値の組みの認識。pythonではイミュータブルだと思うけど、タプルだからといって必ずしもイミュータブルというわけではないのかな。
TypeScriptのタプル型
- JavaScriptには無い概念である、タプル型がある。
- 配列をタプルの代わりとして用いている
[string, number]
のように型を定義する- TypeScriptがタプルと読んでいるのは配列なので、配列のメソッドで操作できる
- 配列のメソッドで操作すると、型に一致しない値を入れられてしまう
- TypeScriptの限界
- 配列のメソッドで操作すると、型に一致しない値を入れられてしまう
- 0要素のタプル型も作れる
- 配列メソッド操作じゃなければタプルのlengthは固定
- ただし、可変長のタプル型の宣言もできる
[number, ...string[]]
みたいな感じで、...配列型
を指定する[...string[], number]
ともできる。最後だけnumber...
が使えるのは1回だけ
- オプショナルな要素もある
[string, number?]
numberはあっても無くても良い[string?, number]
はだめ。オプショナルじゃない要素より後である必要がある
タプル型と可変長引数
- TypeScript3.0より、タプル型を関数の可変長引数の型に使えるようになった
type Args = [string, number, boolean]; const func (...args: Args) => arg[1]
- いまいちメリットがわからん。。(a:string, b:number, c:boolean)と同じではないのか
関数呼び出しのspreadとタプル型
- JSでは
...
を関数呼び出しのときにも使える - タプル型も同様に関数呼び出しでも使える
func(...args)
みたいな
タプル型と可変長引数とジェネリクス
- タプル型をとる型変数を用いることで、関数の引数列をジェネリクスで扱うことができる
U extends any[]
は 型引数Uはanyの部分型でなければならないという意味- string
本日はここまで、なんか、タプル型はいまいち理解が...
- スプレッド演算子
...
- 可変長引数の型を表すのに使える
- 関数の呼び出しでも使える
U extends any[]
型引数Uはany[]型の部分型である
とか、ところどころ理解はできるが、いまいちしっくりこないなぁって感じです。 慣れの問題でしょうか。
ちょっと、辛くなったので、さらっと飛ばして。
明日からは「union型(合併型)」で手を動かします!