「TypeScriptの型入門」で手を動かす - その5

本日は「タプル型」から手を動かします。

qiita.com

タプル型

タプルとは?

pythonとかではa=(1,2)みたいに、順序をもつ値の組みの認識。pythonではイミュータブルだと思うけど、タプルだからといって必ずしもイミュータブルというわけではないのかな。

ja.wikipedia.org

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などの配列型、タプル型は全部any[]の部分型

プレイグラウンドで手を動かす

本日はここまで、なんか、タプル型はいまいち理解が...

  • スプレッド演算子...
    • 可変長引数の型を表すのに使える
    • 関数の呼び出しでも使える
  • U extends any[]型引数Uはany[]型の部分型である

とか、ところどころ理解はできるが、いまいちしっくりこないなぁって感じです。 慣れの問題でしょうか。

ちょっと、辛くなったので、さらっと飛ばして。

明日からは「union型(合併型)」で手を動かします!