我从 api 获取一个
Expense[]
类型的对象数组,该类型具有 due
属性,该属性是 Timestamp
类型对象。我想从 seconds
对象获取 due
属性,并将其格式化为字符串以在 UI 中显示。我似乎无法缩小类型以正确访问.seconds
。这是 Angular 中的内容,但这并不重要。我可以强制转换类型,如下所示,但我想避免强制转换。我还尝试使用 in
关键字并尝试使用 satisfies
,但似乎无法得到它。我的做法完全错误吗?如何正确输入缩小范围?
为了简洁而简化代码
interface Timestamp {
seconds: number;
nanoseconds: number;
}
interface Expense {
name: string;
amount: number;
remaining: number;
due: Timestamp | string;
notes: string;
category: string;
}
this.expenses = expenses.map((expense) => {
if (typeof expense.due !== 'string') {
return { ...expense, due: this.formatDate(expense.due.seconds * 1000) } as Expense;
}
}) as Expense[];
formatDate(milliseconds: number) {
return new Intl.DateTimeFormat('en-ca', {
weekday: 'short',
day: 'numeric',
year: 'numeric',
}).format(new Date(milliseconds));
}
this.expenses = expenses.map((expense) => {
if (typeof expense.due !== 'string') {
return { ...expense, due: this.formatDate(expense.due.seconds * 1000) };
} else {
return expense;
}
});
我添加了 else 条件,它运行时没有错误。不确定这是否是唯一的方法。
if (typeof expense.due !== 'string')
永远都是真的。