【问题标题】:TypeScript difference between any[] and [] when initialize data type初始化数据类型时 any[] 和 [] 之间的 TypeScript 区别
【发布时间】:2023-01-11 12:32:44
【问题描述】:

我用*ngIf判断html中的数组长度

<div *ngIf="apps.length === 0">

并在 .ts 文件中定义应用程序

public apps: any[];

并且应用程序是从其余的 api 数据中检索到的:

ngOnInit() {
    const refSpinner = this._simsSpinnerService.showSpinner('my-apps-spinner');
    const getMyApps = this._myAppsService.getMyApps().pipe(share(), finalize(() => { this._simsSpinnerService.stopSpinner(refSpinner); }))
    this._subscriptions.push(getMyApps.subscribe({
      next: (data) => {
        if (data && data instanceof Array) {
          debugger
          this.apps = data;
        }
      },
      error: (err) => MessageService.addError(err)
    }));
}

控制台将打印错误信息:

ERROR TypeError: Cannot read properties of undefined (reading 'length')
    at MyAppsComponent_Template (my-apps.component.html:13:30)

我添加了调试器,发现 this.apps 在数据分配给它之前是未定义的。

然后我改变了初始化数据类型的方式,如:

public apps = [];

并且报错消失了,发现this.apps在数据赋值之前是一个数组。

我搜索并发现

any[] 是一个数组,其中项的类型为 any。

但为什么它是未定义的?它不应该是其中任何元素的数组吗?

【问题讨论】:

    标签: arrays typescript initialization


    【解决方案1】:

    我相信这是因为原始代码使用了声明,而更新代码进行了初始化。

    宣言

    声明告诉编译器变量名和类型。它不给变量一个值(或者更确切地说,它给它undefined)。换句话说,它宣布变量是什么。

    public apps: any[]; // apps = undefined
    

    初始化

    要实际给变量一个undefined以外的值,我们必须初始化它。

    public apps = []; // apps = []
    

    然后编译器可以推断变量apps的类型,在本例中为Array&lt;any&gt;

    然而,仅此还不足以解释编译器出错的原因。因为你可以保持一个变量未初始化,只要你稍后给它赋值。但是,您尝试使用 &lt;div *ngIf="apps.length === 0"&gt; 读取变量的长度,这会导致错误(因为 undefined 没有属性 length

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2018-08-23
      • 2021-01-30
      相关资源
      最近更新 更多