如何清除打字稿中的类型化数组并保留其类型?

时间:2018-09-28 10:57:58

标签: javascript angular typescript

现在在一个类中,我声明了一个类型为:CustomType的数组,如下所示

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

您可以看到clearArray分配了一个空数组的UNDEFINED类型,这似乎丢失了类型信息。

如何清除数组但保留其声明的类型?

6 个答案:

答案 0 :(得分:9)

类型信息由字段(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 {}

答案 1 :(得分:1)

这则帖子似乎过时了。有一种新方法可以做到这一点。

this.array = [] as CustomType[];

答案 2 :(得分:0)

您可以尝试

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

答案 3 :(得分:0)

可以使用3种方法清空数组

  1. 设置其长度= 0

    myArr.length = 0;

  2. 使用 splice 方法Array

    myArr.splice(0,myArr.length);

  3. Pop()数组的每个元素

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

答案 4 :(得分:0)

  

您始终可以通过更改长度来清除列表项   属性设置为0

例如:this.exampleArray.length = 0

将length设置为0会清除数组中的所有元素,而不会更改数组的引用。

答案 5 :(得分:0)

清除数组,即使它作为参数通过方法传递:

myArray.length = 0;