《TypeScript图形渲染实战:2D架构设计与实现》 —2.2.2 Doom3Token类变量初始化的问题
2.2.2 Doom3Token类变量初始化的问题
接下来继续看一下构造函数(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 ( ) ;
}
图2.2 TypeScript初始化错误
可以发现,TypeScript不再报初始化的错误了,是不是很棒的感觉?这是一个很有用的功能,可以灵活地处理变量初始化的问题,因此值得在这里花点时间讨论一下。最后还是需要强调一点,在使用该变量前一定要初始化变量。
- 点赞
- 收藏
- 关注作者
评论(0)