導入
今日もTypeScriptのお勉強を続けています。その中で気になったところがあり、調べてみることにしました。
とりあえず結論
-
readonly Array<T>
が
error TS1354: 'readonly' type modifier is only permitted on array and tuple literal types.
と言われてダメになる理由がわからない。Array<T>
は配列だしいいんじゃないの?と考えてしまう。
何が気になったの
function getLargest(numArray: readonly number[]): number {
return Math.max(...numArray);
}
こんな感じのものがあったときに、仮引数の型について
numArray: readonly Array<number>
に変えてみたところ怒られました。
そこで、ReadonlyなArray(配列の中身をいじることができない型)であることを表現する方法について、調べることにしました。
ReadonlyなArray
readonly T[]
const numArray: readonly number[] = [1, 2, 3];
ReadonlyArray<T>
const numArray: ReadonlyArray<number> = [1, 2, 3];
as const
const numArray = [1, 2, 3] as const;
まとめ
上記3つが読み取り専用の配列を表現する方法のようです。
ただ、なぜreadonly Array<T>
がダメなのかがずっと引っかかり続けています。
画像のようなエラーが出るということについて、コンパイラはこの文脈においてArray<T>
は「配列およびタプル リテラル型」でないと解釈しているように感じられるからです。
Array<T>
の定義(interface ArrayConstructor
)を見に行くとCreates an array from an array-like object.
とあります。このあたりがミソなのでしょうか。
すっきりしないままですが、そういうものだと思ってとりあえず学習を続けることにします。
その他
8/30: 改題しました。