🔖

競プロ以前の基本的な決まり文句あれこれ(TypeScript編)

に公開

はじめに

最近TypeScriptをつかってLeetCodeに取り組んでいます。他の言語では直感的にできることが、TypeScriptだとそうでもないというケースがいくつかありました。生粋のTypeScript使いにとっては常識だと思うようなあれこれをまとめておきます。

数値でソートする

TypeScriptのソートはデフォルトで文字列ソートになるため、数値でソートしたい場合は書き方を変える必要がある。

const arr = [2, 10, 1, 3, 100, 11];
const arr2 = [2, 10, 1, 3, 100, 11];
const arr3 = [2, 10, 1, 3, 100, 11];

console.log(arr.sort());
// [1, 10, 100, 11, 2, 3] 

console.log(arr2.sort((a, b) => a -b))
// [1, 2, 3, 10, 11, 100] 

console.log(arr3.sort((a, b) => b - a));
// [100, 11, 10, 3, 2, 1] 

Mapの初期化

ハッシュマップの定義の仕方がリテラルな変数と少し違う。

const map = new Map<string, number>();

map.set("one", 1);
map.set("two", 2);

console.log(map.get("two"));
// 2

console.log(map);
//  Map (2) {"one" => 1, "two" => 2} 

配列同士の連結

配列同士を連結する際にはスプレッド構文を使う必要がある

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

console.log([...arr1, ...arr2]);
// [1, 2, 3, 4, 5, 6]

// ちなみに、最大値を求めるようなときもスプレッド構文を要求される
console.log(Math.max(...arr1));
// 3

配列の初期化

やり方たくさんありすぎて可能性は無限大なので注意

// 連番
const nums = Array.from({length: 5}, (_, i) => i);
console.log(nums);
// [0, 1, 2, 3, 4]

// 0埋め
const zeros = Array.from({length: 5}, () => 0);
console.log(zeros);
// [0, 0, 0, 0, 0]

// fillを使ってもよい
const zeros2 = Array(5).fill(0);
console.log(zeros2);
// [0, 0, 0, 0, 0]

// 配列やオブジェクトをfillすると同じ参照になるので注意
const arrs = Array(3).fill([0, 0, 0]);
console.log(arrs);
// [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

arrs[0][1] = 1;
console.log(arrs);
// [[0, 1, 0], [0, 1, 0], [0, 1, 0]]

分割代入

// まれによくある「新たにメモリ確保禁止」系の問題でやるやつ
let arr = Array.from({length: 3}, (_, i) => (i+1)*10);
console.log(arr);
// [10, 20, 30]

[arr[0], arr[1]] = [arr[1], arr[0]];
console.log(arr);
// [20, 10, 30]

おわりに

よきTypeScriptライフを。

Discussion