48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { Asset } from './Asset.js';
|
|
|
|
interface EtfData {
|
|
ticker?: string;
|
|
currentPrice?: number;
|
|
expenseRatio?: string | number;
|
|
totalAssets?: string | number;
|
|
yield?: string | number;
|
|
volume?: string | number;
|
|
fiveYearReturn?: string | number;
|
|
[key: string]: unknown;
|
|
}
|
|
|
|
export interface EtfMetrics {
|
|
expenseRatio: number;
|
|
totalAssets: number;
|
|
yield: number;
|
|
volume: number;
|
|
fiveYearReturn: number;
|
|
}
|
|
|
|
export class Etf extends Asset {
|
|
metrics: EtfMetrics;
|
|
|
|
constructor(data: EtfData) {
|
|
super(data);
|
|
this.metrics = {
|
|
expenseRatio: parseFloat(String(data.expenseRatio)) || 0,
|
|
totalAssets: parseFloat(String(data.totalAssets)) || 0,
|
|
yield: parseFloat(String(data.yield)) || 0,
|
|
volume: parseFloat(String(data.volume)) || 0,
|
|
fiveYearReturn: parseFloat(String(data.fiveYearReturn)) || 0,
|
|
};
|
|
}
|
|
|
|
getDisplayMetrics(): Record<string, string> {
|
|
return {
|
|
Ticker: this.ticker,
|
|
Type: 'ETF',
|
|
Price: this.formatCurrency(this.currentPrice),
|
|
'Exp Ratio%': `${this.metrics.expenseRatio.toFixed(2)}%`,
|
|
'Yield%': `${this.metrics.yield.toFixed(2)}%`,
|
|
AUM: this.formatLargeNumber(this.metrics.totalAssets),
|
|
'5Y Return%': `${this.metrics.fiveYearReturn.toFixed(1)}%`,
|
|
};
|
|
}
|
|
}
|