JavaScript 常见缺陷及 TypeScript 的解决方式(续)
一、静态类型检查的意义
- JavaScript 的动态类型局限:JavaScript 中值的行为依赖于其类型,但动态类型导致运行前难以预测代码结果。例如,对字符串调用函数会报错(TypeError: message is not a function),但错误只能在运行时发现。
- TypeScript 的静态类型检查:静态类型系统可在代码运行前预测行为,通过类型描述值的形状和能力,提前发现潜在错误。例如,调用字符串变量作为函数时,TypeScript 会直接提示错误(This expression is not callable),避免运行时异常。
二、非异常性错误的捕获
- JavaScript 的 “隐式容错” 问题:JavaScript 对某些错误不直接抛出异常,而是返回默认值(如访问不存在的对象属性返回 undefined),容易隐藏 bug。
- TypeScript 的严格检查:TypeScript 会将此类行为标记为错误,例如访问对象不存在的属性时,提示 Property 'xxx' does not exist。
- 常见错误场景:
-
- 拼写错误(如 toLocaleLowercase 与 toLocalLowerCase);
-
- 未调用函数(如 Math.random < 0.5 误写,实际应为 Math.random());
-
- 逻辑错误,示例如下:
const value = Math.random() < 0.5 ? "a" : "b";
if (value !== "a") {
// ...
} else if (value === "b") {
This comparison appears to be unintentional because the types '"a"' and '"b"' have no overlap.
// Oops, unreachable
}
三、类型对开发工具的支持
- 增强开发体验:TypeScript 类型信息可为编辑器提供代码补全、错误提示、快速修复等功能。例如,调用 res.sen 时,编辑器会提示 send/sendFile 等正确方法。
- 高级工具特性:支持重构(代码重组)、导航(跳转到定义 / 查找引用)等,基于类型检查器实现,跨平台且主流编辑器均支持。
四、TypeScript 编译器(tsc)使用
- 安装与基本使用:
-
- 全局安装:npm install -g typescript;
-
- 编译 .ts 文件:tsc 文件名.ts,生成对应的 .js 文件(纯 JavaScript 代码)。
- 错误处理机制:
-
- 即使存在类型错误,默认仍会生成 .js 文件(尊重原始 JavaScript 逻辑);
-
- 启用 --noEmitOnError 选项:tsc --noEmitOnError 文件名.ts,有错误时不生成 .js 文件。
五、类型注解与类型推断
- 显式类型注解:通过 : 为变量、函数参数或返回值指定类型,明确约束值的类型。例如:
function greet(person: string, date: Date): void {
console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}
greet("Maddison", Date()); // 在 JavaScript 中调用 `Date()` 返回一个 `string`
greet("Maddison", new Date()); // 使用 `new Date()` 构造一个 `Date`
编译为js后,“模板字符串”——即使用反引号(`)括起来的字符串——被转换成了普通的字符串连接形式
- 类型推断:TypeScript 可自动推断类型,无需显式注解。例如 let msg = "hello" 会被推断为 string 类型,无需手动添加 : string。
- 注意事项:类型注解仅用于编译检查,编译后会被完全移除,不影响运行时行为。
六、代码转换(Downleveling)
- 定义:将新版本 ECMAScript 特性转换为旧版本(如 ES2015 转 ES5),确保兼容性。例如,模板字符串
${a}${b}会被转为 a.concat(b)。
- 控制转换目标:通过 --target 选项指定目标版本,如 tsc --target es2015 文件名.ts 会保留 ES2015 特性(如模板字符串)。
- 默认设置:默认目标为 ES5,建议现代开发使用 es2015 及以上(多数浏览器已支持)。
七、严格模式设置
- 核心理念:严格模式通过 “开关” 调整类型检查的严格程度,开关越严格,检查越全面,适合新项目启用。
- 关键选项:
-
- noImplicitAny:禁止隐式 any 类型(any 会绕过类型检查,导致 TypeScript 失去意义),变量类型未明确时会报错;
-
- strictNullChecks:严格处理 null/undefined,避免因未处理空值导致的 bug(被称为 “十亿美元错误” 的常见来源)。
- 启用方式:通过 tsc --strict 或 tsconfig.json 中 "strict": true 开启所有严格选项,也可单独开启 / 关闭某一选项。
总结
TypeScript 核心价值在于通过静态类型检查提前发现错误、增强工具支持,并通过灵活的编译选项平衡兼容性与严格性。掌握类型注解、编译器使用及严格模式设置,是高效使用 TypeScript 的基础。
参考 TypeScript:文档 - 基础知识 --- TypeScript: Documentation - The Basics