40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { Asset } from './Asset';
|
|
import type { EtfData, EtfMetrics } from '../types/models.model';
|
|
|
|
export class Etf extends Asset {
|
|
metrics: EtfMetrics;
|
|
|
|
constructor(data: EtfData) {
|
|
super(data);
|
|
// Preserve null for missing fields — coercing to 0 would auto-fail gates
|
|
// in EtfScorer for data Yahoo simply didn't return.
|
|
const num = (v: unknown): number | null => {
|
|
if (v == null) return null;
|
|
const f = parseFloat(String(v));
|
|
return Number.isFinite(f) ? f : null;
|
|
};
|
|
this.metrics = {
|
|
expenseRatio: num(data.expenseRatio),
|
|
totalAssets: num(data.totalAssets),
|
|
yield: num(data.yield),
|
|
volume: num(data.volume),
|
|
fiveYearReturn: num(data.fiveYearReturn),
|
|
};
|
|
}
|
|
|
|
getDisplayMetrics(): Record<string, string> {
|
|
const m = this.metrics;
|
|
const fmt = (v: number | null, dec: number, suffix = '') =>
|
|
v != null ? `${v.toFixed(dec)}${suffix}` : '—';
|
|
return {
|
|
Ticker: this.ticker,
|
|
Type: 'ETF',
|
|
Price: this.formatCurrency(this.currentPrice),
|
|
'Exp Ratio%': fmt(m.expenseRatio, 2, '%'),
|
|
'Yield%': fmt(m.yield, 2, '%'),
|
|
AUM: m.totalAssets != null ? this.formatLargeNumber(m.totalAssets) : '—',
|
|
'5Y Return%': fmt(m.fiveYearReturn, 1, '%'),
|
|
};
|
|
}
|
|
}
|