2023.04.16 - TS编译之后的JS不具备校验功能

TypeScript 编译后的 JavaScript 文件并不具备类型检查的功能,因为 JavaScript 语言本身是动态类型、弱类型的,在运行时无法推断变量的类型,只能在编译时推断。而将 TypeScript 文件编译成 JavaScript 文件时,会把 TypeScript 中的类型声明和类型检查都去掉,只保留 JavaScript 代码,所以 TypeScript 编译后的JavaScript文件并不能进行类型检查。
如果需要在 JavaScript 中进行类型检查,可以使用像 JSDoc、Flow、PropTypes 等第三方工具进行类型声明和类型检查,但与 TypeScript 相比,它们的类型检查功能都比较有限。因此,如果需要更严格的类型检查,更推荐使用 TypeScript

当使用 JSDoc 进行类型声明时,我们需要在注释中使用特定的语法来描述参数和返回值类型。下面是一个使用 JSDoc 进行类型校验的例子:

/**
 * 返回两数之和
 * @param {number} a 第一个加数
 * @param {number} b 第二个加数
 * @returns {number} 两数之和
 */
function add(a, b) {
  return a + b;
}

console.log(add(1, 2)); // 3
console.log(add(1, "2")); // "12"

在上面的例子中,我们使用 @param 注释描述了第一个加数 a 和第二个加数 b 的类型,使用 @returns 注释描述了函数返回值的类型。在代码中,如果我们传入了不符合类型要求的参数,比如使用字符串 "2" 代替数字 2,则会得到一个错误的结果。

需要注意的是,JSDoc 只提供了注释的形式进行类型声明,并不会进行类型检查。即使我们通过注释声明了参数和返回值类型,但 JavaScript 并不会对其进行类型检查,仍将维持原本的动态、弱类型特性。

JSDoc也可以参考类似于 JSDoc 文档参考这样的文档

下面是一个使用 Flow 进行类型检查的完整项目例子:

  1. 安装 Flow:
npm install -g flow-bin
  1. 在项目根目录下创建 .flowconfig 配置文件,并添加以下配置:
[ignore]
<PROJECT_ROOT>/node_modules/.*

[include]

[libs]

[options]
module.system=node
  1. 在项目中初始化 package.json 文件:
npm init -y
  1. 安装项目依赖:
npm install --save-dev flow-bin
  1. package.json 文件中添加 scripts 配置:
{
  "name": "flow-example",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "flow": "flow"
  },
  "devDependencies": {
    "flow-bin": "^0.153.0"
  }
}
  1. src 目录下创建 index.js 文件,并添加以下代码:
// @flow

function add(a: number, b: number): number {
  return a + b;
}

console.log(add(1, 2));
console.log(add(1, "2"));

在上面的代码中,我们添加了 @flow 注释告诉 Flow 进行类型检查,声明了 add 函数的参数和返回值类型。在 console.log 语句中使用不符合类型要求的参数时,会在控制台输出类型错误提示。

  1. 启动 Flow 服务:
npm run flow

启动后,Flow 会对项目中的 JavaScript 文件进行类型检查,并输出类型错误提示。如果遇到问题,可以根据提示信息修复代码,然后重新运行 Flow 服务来进行验证。

  1. 执行程序:
node src/index.js

上述例子仅为了演示如何使用 Flow,在实际项目中,我们应该尽可能完善注释、引用 Flow 的类型库以及在代码中遵循 Flow 的规范来提高项目的类型检查覆盖率。

posted @ 2023-04-16 15:38  吕业浩  阅读(97)  评论(0编辑  收藏  举报