Как использовать isArray() в typescript?

У меня есть эта переменная с именем records,

Теперь я хочу проверить, не массив или нет в angular2/typescript?

В AngularJS, который я раньше делал:

ng-if="selectedCol.data && !isArray(selectedCol.data)"

Но когда я пытаюсь сделать следующее, это не работает;

*ngIf="selectedCol.model.data && !Array.isArray(selectedCol.model.data)"

Это дает мне ошибку ниже:

TypeError: Невозможно прочитать свойство isArray из undefinedлюбые входы?

Ответ 1

Angular 2 шаблон выполняется внутри Component контекста, то есть вы можете получать доступ только к свойствам/методам, определенным внутри Component

Самый простой способ - определить метод isArray в Component

isArray(obj : any ) {
   return Array.isArray(obj)
}

В шаблоне

*ngIf="isArray(selectedCol.model.data)"

Чтобы избежать кода шаблона, определите Service с методом isArray, зарегистрируйтесь как Singleton, введите в Component и используйте метод isArray через свойство службы

Альтернативно, определите свойство _array в Component и присвойте ему Array

  private _array = Array;

В шаблоне

*ngIf="_array.isArray(selectedCol.model.data)"

Ответ 2

В дополнение к тому, что сказал @tchelidze:

Angular 2 предоставляет оболочку с именем isArray в facade/lang, экспортированную и определенную следующим образом:

export function isArray(obj: any): boolean {
  return Array.isArray(obj);
}

Вы можете импортировать его в свой компонент следующим образом:

import {isArray} from '@angular/facade/lang';

Затем вы можете публиковать его публично в своем компоненте:

this.isArray = isArray

И используйте в своем шаблоне так:

*ng-if="selectedCol.data && !isArray(selectedCol.data)"

Ответ 3

Не будучи наиболее эффективным решением (см. другой ответ), [].constructor.isArray подходит для любого контекста выражения и не требует заражения классов компонентов с помощью помощников на уровне языка:

*ngIf="selectedCol.model.data && [].constructor.isArray(selectedCol.model.data)"