項目26 関数型の標準APIやライブラリを使って型の流れを促進する
TyepScirptで、手書きのループ処理を使って処理を書く場合、一時変数を用いると、型エラーが発生しやすい
これは、空配列などの初期化変数はany型になるため
code:ts
const rowsImperative = rawRows.slice(1).map(rowStr => {
const row = {};
rowStr.split(',').forEach((val, j) => {
row[headersj] = val;
// ~~~~~~~~~~~~ No index signature with a parameter of
// type 'string' was found on type '{}'
// 型 'string' のパラメーターを持つインデックス
// シグネチャが型 '{}' に見つかりませんでした。
});
return row;
});
バニラJavaScriptを用いた、関数型チックなコードでも物によっては型エラーが発生する
reduceで使用するacc変数rowの初期値が{}のため
code:ts
const rowsFunctional = rawRows.slice(1)
.map((rowStr) =>
rowStr
.split(",")
.reduce(
(row, val, i) => ((row[headersi] = val), row),
// ~~~~~~~~~~~~~~~ No index signature with a parameter of
// type 'string' was found on type '{}'
// 型 'string' のパラメーターを持つインデックス
// シグネチャが型 '{}' に見つかりませんでした。
{}
)
);
上記のような背景から、TypeScriptのコードではLodashのソリューションが指示される
Radashというものもある
code:ts
const rowsLodash =
rawRows.slice(1).map(rowStr => _.zipObject(headers, rowStr.split(',')));
rowsLodash // const rowsLodash: _.Dictionary<string>[]
型アノテーションを使用せずに、型エラーを回避して処理をかける点が良い
関数型の標準APIやLodashのようなライブラリと型が相性が良いのは、値を変更せず、新しい値を返す(純粋関数)であるため
#TypeScript