我是TypeScript的新手,并且在基本类实例化方面遇到了麻烦。
我有一个命名空间RecordsService,其中声明了类Record。我希望能够在RecordsService中创建记录,然后通过其他方法等公共方法访问它们。
export namespace RecordsService {
let records: Array<Record> = new Array();
function init () {
let record1 = new Record(new Date(), 1);
}
init();
export function getAllRecords() {
return records;
}
class Record {
constructor (public date: Date, public id: number) {
this.date = date;
this.id = id;
}
}
}
上面没有抛出任何转换错误,但是在运行时我得到了一个控制台错误,如下所示
TypeError:Record不是构造函数(...)
错误为let record1 = new Record(new Date(), 1);
的行
在这种情况下如何创建新记录?
Plunker,查看控制台日志以查看错误:https://plnkr.co/edit/FNk8b1ZwA5HL3I7wAnTq?p=preview
答案 0 :(得分:1)
您需要将Record
课程移到init
以上的职能:
class Record {
constructor (public date: Date, public id: number) {
this.date = date;
this.id = id;
}
}
let records: Array<Record> = new Array();
function init () {
let record1 = new Record(new Date(), 1);
}
init();
或者在init
的定义后调用Record
函数:
let records: Array<Record> = new Array();
function init () {
let record1 = new Record(new Date(), 1);
}
export function getAllRecords() {
return records;
}
class Record {
constructor (public date: Date, public id: number) {
this.date = date;
this.id = id;
}
}
init();
发生这种情况的原因是javascript是一种解释型语言,解释器会在另一种语言之后解析代码行,因此它在解释{{1}之前到达init()
部分(在原始代码中) }。class。
Record
函数的内容在您执行函数之前不会被解释,这就是为什么在类定义之前将它安全并且之后执行它的安全原因。
另外,如果你这样做:
init
然后没有必要这样做:
constructor (public date: Date, public id: number)
它是:
this.date = date;
this.id = id;
或者
class Record {
constructor (public date: Date, public id: number) {}
}