惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
T
Tailwind CSS Blog
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
博客园 - 叶小钗
N
Netflix TechBlog - Medium
罗磊的独立博客
量子位
MyScale Blog
MyScale Blog
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
B
Blog
腾讯CDC
爱范儿
爱范儿
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
F
Fortinet All Blogs
雷峰网
雷峰网
G
Google Developers Blog
Google DeepMind News
Google DeepMind News

远飞闲记

用 OpenClaw 搭建全自动晨间简报系统 Open Claw(🦞龙虾): 新手最常踩的 8 个坑,我帮你踩过了 什么是AI Agent(智能体)? OpenClaw 在微信端使用指南 如何让OpenClaw🦞更好用-调教篇 OpenClaw(龙虾🦞)自主赚钱实验笔记 本地Qwen+云模型:OpenClaw真实体验 AI博客主题开发记 OpenClaw初试记 十年博客路:在AI水文泛滥的时代,为何还在坚守? AI Coding实战吐槽:别被"400刀大神"带偏,这些坑我帮你踩过了! 《相信》把不可能变为可能 我们写的程序被杀毒软件杀了,杀毒软件到底杀了什么? 👋2024 探索Unity单元测试:构建可靠游戏代码的基石 实用小黄鸭调试法 炸裂的Unity割韭菜这事 还是要有信念 您好2023 Docker启动提示虚拟化失败 Golang中配置文件热重载方案 重置博客主题 双链知识管理及logseq使用体验 魔幻的魔都疫情 漫谈国内NFT市场状况 如何在UE4中平衡蓝图与C++的使用 2021时光荏苒,2022可遇可期 UE4(Unreal Engine)本地化资源功能 摈弃:“拥有更多=做的更好的”的观念 鱿鱼游戏
TypeScript强类型判断引发的问题
2019-07-18 · via 远飞闲记

项目组里面的小伙子遇见一个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
// ........
  }