无法在转换后访问对象方法

时间:2018-02-09 12:37:18

标签: javascript angularjs typescript

我正在尝试访问模型方法的某些对象,但一直收到错误,表示没有这样的函数。

这是我写的模型类:

class Expense {
  private name: string;
  private title: string;
  private amount: number;
  private description: string;
  private date: Date;
  private status: string;
  public formatetdDate: string;
  private _id : string;
  constructor(name: string, title: string, amount: number, description: string, date: Date, status: string) {
    this.name = name;
    this.title = title;
    this.amount = amount;
    this.description = description;
    this.date = new Date(0);
    this.status = status;
    this.formatetdDate = this.dateFormat();
  }

  public getDate(): Date {
    return this.date;
  }
  public dateFormat(): string {

    let dd = this.date.getDate();
    let mm = this.date.getMonth() + 1;
    const yyyy = this.date.getFullYear();

    if (dd < 10) {
      dd = +`0${dd}`;
    }
    if (mm < 10) {
      mm = +`0${mm}`;
    }
    console.log(dd + '/' + mm + '/' + yyyy);
    return dd + '/' + mm + '/' + yyyy;
  }
}
export default Expense;

现在我正在使用http调用从服务器检索数据并将其转换为此模型:

   this.expenseService.getExpensesList().subscribe((expenses) => {
      if (expenses.success) {
        this.expensesList = expenses.data as Expense[];
        this.total = +expenses.total;
        this.pages = +expenses.pages;
        this.limit = +expenses.limit;
      } else {
        alert(expenses.message);
      }
    });

如果生病了尝试做以下行动:

this.expensesList[0].getData()

this.expensesList[0].dateFormat()

它总是抛出那些没有功能的错误。 但如果我将尝试打印日期(this.expensesList [0] .date) 它会抛出错误的访问违规(私人)

我做错了什么?

由于

1 个答案:

答案 0 :(得分:2)

as Expense[]只是一个类型的提示,告诉Typescript expenses.data实际上是一个Expense对象的数组,尽管其他的Typescript可能推断出来。但是,它们是不是 Expense个对象,它们仅仅是普通对象(或者我认为是这样)。您需要实际循环遍历数据并从中创建new Expense个对象,以使它们成为Expense个对象,这些对象将具有getDate方法。

  

但是,如果我将尝试打印日期(this.expensesList[0].date),它将引发违规访问(私人)

是的,因为您已经确信静态类型检查器是您尝试访问Expense对象的属性(无论这是否真实)。

这就是为什么你应该谨慎使用as,只有当你真正知道自己在做什么时才这样做;它可以防止类型检查器完成它的工作,这些问题只会在运行时浮出水面而不会在编译时被捕获。