• #typescript
  • #type-error
  • #eac-light-data
  • #financial-quiz
  • #bug-fix
未分類

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_PctEBIT_Adj__Margin_Pct
Net-Income-Adj.-Margin-%Net_Income_Adj._Margin_PctNet_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() 関数の結果を使用するよう修正済み。

関連ドキュメント

教訓

  1. 自動生成ファイルの型定義は、生成ロジックと同じ変換を使うべき
  2. 特殊文字(ドット、スラッシュ等)を含むプロパティ名は引用符で囲む
  3. TypeScriptエラーは数が多くても根本原因は1つの場合がある(今回は2プロパティの修正で1,000件以上解消)