Typescript数组接受字符串值

时间:2016-02-16 20:19:07

标签: javascript arrays typescript angular

我有这个angular2打字稿数组

我的角度文件的一部分

export class ParametersForm {
  myForm: ControlGroup;
  systemParameters: AbstractControl;
  arr: number[];

  constructor(fb: FormBuilder) {
    this.myForm = fb.group({
      "realisations" : [""],
      "numConstSteps" : [""],
      "timeHorizon": [""],
      "continuationStep" : [""],
      "continuationStepSign" : [""],
      "numberOfModelParameters" : [""],
      "systemParameters" : [],
      "param" : [""],
      "netLogoFile" : [""],
      "numberOfModelVariables" : [""],
      "restrictOperator" : [""],
      "liftOperator" : [""],
      "xInitial" : [""]

    });
    this.arr = [];
    this.systemParameters = this.myForm.controls["systemParameters"];
  }
  addToArray(event, value: any): void {
    if (event.which === 13) {
      this.arr.push(value);
      (<Control>this.systemParameters).updateValue("");
    }
  }

  deleteItem(value: any): void {
    let pos = this.arr.indexOf(value);
    this.arr.splice(pos, 1);
    console.log(this.arr);
  }
  onSubmit(form: any): void {
    console.log(this.arr);
    form.systemParameters = this.arr;
    console.log("your submitted value:", form);
  }

}

您可以看到arr:number[]

我读它的方式,它说,这个arr是一个类型编号的数组 - 期待它中的数字

然后我怎么能输入一个字符串呢?

这是一个显示这个的plunker(在输入字段中输入后检入控制台)

plunkr

是正常还是?

2 个答案:

答案 0 :(得分:3)

类型仅适用于开发期间的编译器和开发人员。

只要您删除ts文件,类型信息就会丢失。我们可以说它们只是一种幻觉。

TypeScript在运行时不会阻止任何事情。事实上,在运行时期间没有TypeScript这样的东西。您的普通旧JavaScript运行方式与TypeScript诞生之前的运行方式相同。

所以你只能在这种情况下这样做:

addToArray(event, value: any): void {
    if (event.which === 13 && value) {
        this.arr.push(value);
        (<Control>this.systemParameters).updateValue("");
    }
}

为了进一步强调运行期间没有类型安全性的观点,只需检查TypeScript Playground即可。在左侧,您可以看到TypeScript代码,在右侧您可以看到生成的JS代码。

尝试一些东西(界面声明等,一般使用类型),看看它们是如何从JavaScript中消失的。

答案 1 :(得分:3)

遗憾的是,这是预期的,数组确实有类型,但TypeScript会使any值成为例外。这可能是为了向后兼容JS。

例如,这很好,很遗憾。

arr: MyClass[];
func(value: any) {
    this.arr.push(value);
}

然而,这不会起作用:

arr: MyClass[];
func(value: string) {
    this.arr.push(value);
}

因此,请避免使用any来缓解此问题。

如果您正在谈论运行时问题,可以使用typeof检查其类型。

addToArray(event, value: number): void {
   if (event.which === 13 && typeof value == 'number') {
        this.arr.push(value);
        (<Control>this.systemParameters).updateValue("");
     }
}