Как очистить типизированный массив в машинописном тексте и сохранить его тип?

Теперь в классе я объявил массив с типом: CustomType, как показано ниже

class Example {
  public exampleArray: CustomType[];
  public clearArray() {
    this.exampleArray = [];
  }
}

Поскольку вы можете видеть, что clearArray присваивает НЕУТОЧНЕННЫЙ тип пустого массива, который, похоже, потерял информацию о типе.

Как я могу очистить массив, но сохраняя его объявленный тип?

Всего 4 ответа


Информация о типе определяется аннотацией типа в поле ( exampleArray: CustomType[] ). Во время выполнения массивы Javascript все равно нетипизированы. Компилятор позволит пустующему массиву ( [] ) присваиваться чему угодно, поскольку это считается безопасным, поскольку внутри нет объектов, он может быть массивом CustomType . Тогда тип поля не позволит вам форсировать нажатие на объекты массива любого другого типа:

class CustomType { x: number}
class Example {
    public exampleArray: CustomType[];
    public clearArray() {
        this.exampleArray = [];
        this.exampleArray.push(new CustomType())
        this.exampleArray.push({}) // error not a `CustomType`
    }
}

Заметка

Если бы это была переменная без аннотации типа, переменная была бы выведена на any[] , что может привести к проблемам (типы не проверяются ни при назначении литерала массива, ни при нажатии на массив):

let noAnnotationArray = [] //  any[]

В этом случае добавление аннотации типа остается лучшим способом. Утверждения типа (как предложено в других ответах) могут привести к ошибкам, которые не удалось выполнить, если позже кто-то добавит элемент в массив:

let withAnnotation:CustomType[] = [{}] //  error
let withAssertion = <CustomType[]>[{}] // no error even though we assign {}

Вы можете попробовать

this.exampleArray = <CustomType[]>[];

Возможны 3 способа опорожнения массива

  1. установив его длину = 0

    myArr.length = 0;

  2. использование метода сплайсинга Array

    myArr.splice(0,myArr.length);

  3. Pop () каждый элемент массива

    while(myArr.length){
      myArr.pop();
    }    
    

Вы всегда можете очистить элементы списка, изменив свойство length на 0

например: this.exampleArray.length = 0

Установка длины в 0 очищает все элементы массива без изменения ссылки на массив.


Есть идеи?

10000