[英]TypeScript typed array usage
我有一个像这样开始的TypeScript类定义;
module Entities {
export class Person {
private _name: string;
private _possessions: Thing[];
private _mostPrecious: Thing;
constructor (name: string) {
this._name = name;
this._possessions = new Thing[100];
}
看起来像Thing类型的数组无法正确转换为相应的Javascript数组类型。 这是生成的JavaScript的一个片段:
function Person(name) {
this._name = name;
this._possessions = new Entities.Thing[100]();
}
执行包含Person对象的代码,在尝试初始化_possession字段时抛出异常:
错误是“0x800a138f - Microsoft JScript运行时错误:无法获取属性'100'的值:对象为null或未定义”。
如果我将_possession的类型更改为any[]
并使用new Array()
初始化_possession,则不会抛出异常。 我错过了什么?
您的语法中有错误:
this._possessions = new Thing[100]();
这不会产生“一系列事物”。 要创建一个数组,您只需使用数组文字表达式:
this._possessions = [];
如果要设置长度,则为数组构造函数:
this._possessions = new Array(100);
我已经创建了一个简短的工作示例,您可以在操场上尝试。
module Entities {
class Thing {
}
export class Person {
private _name: string;
private _possessions: Thing[];
private _mostPrecious: Thing;
constructor (name: string) {
this._name = name;
this._possessions = [];
this._possessions.push(new Thing())
this._possessions[100] = new Thing();
}
}
}
您可以尝试其中任何一种。 他们没有给我错误。
它也是数组声明的typescript建议的方法。
通过使用Array<Thing>
它正在使用打字稿中的泛型。 它类似于在c#代码中要求List<T>
。
// Declare with default value
private _possessions: Array<Thing> = new Array<Thing>();
// or
private _possessions: Array<Thing> = [];
// or -> prefered by ts-lint
private _possessions: Thing[] = [];
要么
// declare
private _possessions: Array<Thing>;
// or -> preferd by ts-lint
private _possessions: Thing[];
constructor(){
//assign
this._possessions = new Array<Thing>();
//or
this._possessions = [];
}
翻译是正确的,表达式的输入不是。 TypeScript错误地将表达式new Thing[100]
键入为数组。 使用索引运算符索引Thing
(一个构造函数)应该是一个错误。 在C#中,这将分配一个包含100个元素的数组。 在JavaScript中,它调用Thing
索引100处的值,就像构造函数一样。 由于该值undefined
因此会引发您提到的错误。 在JavaScript和TypeScript中,您需要new Array(100)
。
您应该将此报告为CodePlex上的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.