《TypeScript图形渲染实战:2D架构设计与实现》 —2.2.2 Doom3Token类变量初始化的问题

举报
华章计算机 发表于 2019/12/11 12:22:28 2019/12/11
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第2章,第2.2.2节,作者是步磊峰。

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 ( ) ;

}

 image.png

图2.2  TypeScript初始化错误

  可以发现,TypeScript不再报初始化的错误了,是不是很棒的感觉?这是一个很有用的功能,可以灵活地处理变量初始化的问题,因此值得在这里花点时间讨论一下。最后还是需要强调一点,在使用该变量前一定要初始化变量。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。