远飞闲记

阅读、思考、技术

TypeScript强类型判断引发的问题

🗓️发布日期:2019-07-18 · 🗺️总字数: 527 字 · ⏱️阅读时间: 2 Minute

项目组里面的小伙子遇见一个BUG,在游戏里面两个场景切换过程中总是找不到IndexScene类场景但获取场景的变量又是有值的,他很是摸不着头脑我就试着帮忙分析了下,最终深入了解后发现是因为对TS代码类型理解错误导致的,具体导致BUG的TS代码摘抄如下:

    let indexScene: IndexScene = SceneManager.getInstance().currentRunScene as IndexScene;
    if(indexScene)
    {
	// to do something
	// ........
    }

看TS代码是没有什么问题的很正常的写法,然后又查看TS编译器转换后的JS代码如下:


var indexScene = SceneManager.getInstance().currentRunScene;
if(indexScene)
{
// to do something
// ........
}

看转换后的代码就懂TS的类型检查仅仅是在把TS代码转换成JS代码的时候对TS语法糖 as 和 变量类型声明或强制类型转换进行判断,但最终并没有在转换后的JS代码中表现出来,所以就会导致JS代码在运行时候出现 if(indexScene) 无效的情况。

但在强类型语言比如C++/C中如果强转类实列到具体的某个类型要嘛会在编译的时候抛错,如果编译通过后在运行时也返回一个 null,但弱类型的编程语言可就不是这样的了,毕竟它的变量类型不是强制性的可以代表任何类型。

这也是属于弱类型编程语言特性问题,但以后如何避免这样的问题,尽量少少依赖TS的类型强转换语法糖来做类实列是否存在的判断,如果有上边的需求可以使用JS的 instanceof 运算符进行是否属于具体类实列的判断,上边代码改造如下:

  let indexScene: IndexScene = SceneManager.getInstance().currentRunScene as IndexScene;
  if(indexScene instanceof IndexScene)
  {
// to do something
// ........
  }