如何在对象属性上输入窄对象和字符串的联合类型?

问题描述 投票:0回答:1

我从 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));
  }

typescript
1个回答
0
投票
  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')
永远都是真的。

© www.soinside.com 2019 - 2024. All rights reserved.