未分類
eac-light-data.ts の TypeScript エラー修正レポート
発生した問題
VSCodeの問題タブに約1,000件以上のTypeScriptエラーが表示されていた。
エラーメッセージ
オブジェクト リテラルは既知のプロパティのみ指定できます。
"EBIT_Adj._Margin_Pct" は型 '{ Sales_Adjusted?: number | null | undefined; ... }'
に対してここで宣言されたプロパティ 'metrics' から取得されています
原因分析
根本原因
生成スクリプトgenerate-eac-light-data.mjsにおいて、型定義と実際のデータ生成とで異なるプロパティ名を使用していた。
| 箇所 | プロパティ名 | 備考 |
|---|---|---|
| 型定義 (interface) | EBIT_Adj__Margin_Pct | アンダースコア2つ |
| 実データ (JSON) | EBIT_Adj._Margin_Pct | ドット + アンダースコア |
変換ロジックの問題
スクリプト内の toTsKey() 関数:
function toTsKey(metricName) {
return metricName
.replace(/-/g, '_') // ハイフン → アンダースコア
.replace(/%/g, 'Pct') // % → Pct
}
この関数は ドット . を変換しないため:
- 入力:
EBIT-Adj.-Margin-% - 出力:
EBIT_Adj._Margin_Pct(ドットが残る)
しかし型定義では手動で EBIT_Adj__Margin_Pct と書いていたため、不一致が発生。
影響を受けたプロパティ
| SQLiteのメトリクス名 | 正しいTSキー | 誤った型定義 |
|---|---|---|
EBIT-Adj.-Margin-% | EBIT_Adj._Margin_Pct | EBIT_Adj__Margin_Pct |
Net-Income-Adj.-Margin-% | Net_Income_Adj._Margin_Pct | Net_Income_Adj__Margin_Pct |
修正内容
修正ファイル
apps/web/scripts/generate-eac-light-data.mjs の型定義出力部分:
// Before (誤り)
output.push(` EBIT_Adj__Margin_Pct?: number | null`)
output.push(` Net_Income_Adj__Margin_Pct?: number | null`)
// After (修正後)
output.push(` 'EBIT_Adj._Margin_Pct'?: number | null`)
output.push(` 'Net_Income_Adj._Margin_Pct'?: number | null`)
修正後のデータファイル再生成
cd apps/web
node scripts/generate-eac-light-data.mjs
再発防止策
1. ドット入りプロパティには引用符を使用
TypeScriptでドットを含むプロパティ名を定義する場合、引用符で囲む必要がある:
// 正しい
metrics: {
'EBIT_Adj._Margin_Pct'?: number | null
}
// 誤り(ドットなしなら可)
metrics: {
EBIT_Adj__Margin_Pct?: number | null
}
2. 型定義も自動生成する
型定義とデータ生成で同じ変換ロジックを使用することで、不一致を防ぐ。現在のスクリプトは型定義もデータも同じ toTsKey() 関数の結果を使用するよう修正済み。
関連ドキュメント
- VSCode問題タブの警告分析レポート - 以前の同様の分析
- actual-consensus ページ改善計画 - eac-light-data.ts の作成経緯
教訓
- 自動生成ファイルの型定義は、生成ロジックと同じ変換を使うべき
- 特殊文字(ドット、スラッシュ等)を含むプロパティ名は引用符で囲む
- TypeScriptエラーは数が多くても根本原因は1つの場合がある(今回は2プロパティの修正で1,000件以上解消)