TypeScript では、要素数が限定された配列をタプルと呼ぶ。 タプル型には面白い特徴がある。

const foo = ["a", 1]; としたとき foo の型は [string, number] ではなく (string | number)[] になる。したがって、次のコードは failTuple の初期化時に型エラーになる。

const foo = ["a", 1];  // (string | number)[]
const failTuple: [string, number] = foo;  // 型エラー!!

これを回避するための簡単な方法は、型を明示的に指定することである。具体的には次のようにする。

const bar: [string, number] = ["a", 1];  // [string, number]
const successTuple: [string, number] = bar;

as const をつけて変数を初期化することもできる。次の例では bar の型は readonly [string, number] となり、タプルの中身は変更できない。

const bar: [string, number] = ["a", 1];  // readonly [string, number]
const successTuple: [string, number] = bar;
// successTuple[0] = "b";  // エラー!! (Cannot assign to '0' because it is a read-only property.)

付録として Playground で実験したときのコードスニペットをリンクしておく。