接下来继续来看一下构造函数(constructor关键字)和reset函数,代码如下:
public constructor ( ) {
this . _charArr . length = 0 ;
this . _type = ETokenType . NONE ;
this . _val = 0.0 ;
}
public reset ( ) : void {
this . _charArr . length = 0 ;
this . _type = ETokenType . NONE ;
this . _val = 0.0 ;
}
我们会发现constructor中的代码和reset中的代码一模一样,那么读者可能会问,为什么不在constructor中直接调用reset函数呢? 其实这里涉及到TypeScript对成员变量初始化的时机点问题。大家可以试一下,如果我们在constructor中调用reset函数,TypeScript编译器会报“xxx属性没有初始化表达式,且未在构造函数中明确赋值。”的错误,如下图2.2所示。
从上述错误描述中我们可以知道,TypeScript对于成员变量的初始化有两个时机点,第一个时机点是在成员变量声明时立即进行赋值(初始化),如private _charArr : string [ ] = [ ] ; 这句代码所示,这种称为初始化表达式。 如果不在成员变量声明时立即赋值的话,那么就只能是在constructor构造函数中进行变量赋值(初始化)。但是你会发现,有时候延迟初始化或重新初始化是很有必要的一种操作。幸运的是,从TypeScript 2.7版本开始支持使用!(感叹号)来进行变量的显示断言赋值声明,我们来修改一下代码,看一下效果,具体代码如下:
// 使用!操作符来进行显示断言赋值声明
private _val ! : number ;
private _type ! : ETokenType ;
public constructor ( ) {
// this . _charArr . length = 0 ;
// this . _type = ETokenType . NONE ;
// this . _val = 0.0 ;
this . reset ( ) ;
}
我们会发现,TypeScript不再报初始化的错误了,是不是很棒的感觉。这是一个很有用的功能,可以让我们灵活的处理变量初始化的问题,因此值得在这里花点时间讨论一下。还是需要强调一点,在使用该变量前一定要初始化变量。