我有这个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(在输入字段中输入后检入控制台)
是正常还是?
答案 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("");
}
}