Skip to content

严格模式

严格模式是引入一些限制来提高代码安全性和可维护性

  • 对于一些静默错误, 严格模式下会直接抛出错误
  • 严格模式修复了一些 Js 引擎难以执行优化的缺陷, 提升了性能
  • 严格模式禁用了新式语法

具体规则:

  • 禁止

tsconfig.json

json
// 当前配置为默认值
{
  // 相对路径或绝对路径的文件列表, 指定 tsc 编译器需要编译的文件列表
  "files": ["dir1/index.ts"],

  // 需要支持的文件列表, 支持 glob 通配符
  "include": ["dir2/**/*"],

  // 指定排除的文件列表, 但不能排除 files 直接指定的文件, 默认包含 node_modules
  "exclude": ["dir2/index2.ts"],

  // 从另一个文件继承配置
  "extends": "",

  // 编译配置
  "compileOptions": {
    "target": "es5",

    "jsx": "preserve",
    // 指定生成目标为 react JSX 时使用的 JSX 工厂函数
    "jsxFactory": "React.createElement",

    // 是否生成 sourcemap 文件
    "sourcemap": false,
    // 生成单个 sourcemap 文件, 需要开启 sourcemap 选项
    "inlineSourceMap": false,

    // 允许编译 js 文件
    "allowJs": false,

    // module === 'system' 或者设置了 esModuleInterop 且 module 不为 es2015/esnext
    // 允许从没有设置默认导出的模块中默认导入, 不影响代码输出, 仅作为类型检查
    "allowSyntheticDefaultImports": false,

    // 通过为导入内容创建命名空间, 实现 CommonJS 和 ES 模块之间的互操作性
    "esModuleInterop": false,

    // 不报告执行不到的代码错误
    "allowUnreachableCode": false,

    // 不报告未使用的标签错误
    "allowUnusedLabels": false,

    // 以严格模式解析, 并为每个源文件生成 "use strict" 语句
    "alwaysStrict": false,

    // 解析非相对模块名的基准目录
    "baseUrl": ".",

    // 输入文件的字符集
    "charset": "utf8",

    // 在 .js 文件中报告错误, 与 allowJs 配合使用
    "checkJs": false,

    // 生成相应的 .d.ts 文件
    "declaration": false,

    // 生成声明文件的输出路径
    "declarationDir": "",

    // 显示诊断信息
    "diagnostics": false,

    // 禁用 Js 工程体积大小的限制
    "disableSizeLimit": false,

    // 在输出文件的开头加入 BOM 头(UTF-8 Byte Order Mark), 用于标识文件编码格式
    "emitBOM": false,

    // 启用装饰器元数据的生成
    "emitDecoratorMetadata": false,
    // 启用实验性的ES装饰器
    "experimentalDecorators": false,

    // 不生成输出文件
    "noEmit": false,

    // 报错时不生成输出文件
    "noEmitOnError": false,

    // 在表达式和声明上有隐含的 any 类型时报错
    "noImplicitAny": false,

    // 不是函数的所有返回路径都有返回值时报错
    "noImplicitReturns": false,

    // 当 this 表达式的值为 any 类型时, 生成错误
    "noImplicitThis": false,

    // 不包含默认的库文件(lib.d.ts)
    "noLib": false,

    // 有未使用的局部变量则报错
    "noUnusedLocals": false,

    // 有未使用的参数则报错
    "noUnusedParameters": false,

    // 重定向输出目录, 不能和 outFile 同时使用
    "outDir": "dist",

    // 将输出文件合并为一个文件, 合并顺序根据传入编译器的文件顺序和 ///<reference``> 和 import 的文件顺序决定
    "outFile": "",

    // 模块别名配置
    "paths": {},

    // 是否保留 const 和 enum 声明, 用于优化输出或调试
    "preserveConstEnums": false,

    // 保留 watch 模式下过时的控制台输出
    "preserveWatchOutput": false,

    // 控制输出的目录结构, 例如: 当你的代码在 src 目录下, 输出会生成一层 src 目录, 将 rootDir 指定为 src 就可以去掉
    "rootDir": "",

    // 忽略所有声明文件(*.d.ts)的类型检查
    "skipLibCheck": false,

    // 禁用函数参数双向协变检查
    "strictFunctionTypes": false,

    // 确保类的非 undefined 属性已经在 构造函数里初始化, 需要同时启用 strictNullChecks
    "strictPropertyInitialization": false,
    // 在严格的 null 检查模式下, null 和 undefined 值不包含在任何类型里, 只允许用它们自己和 any 来赋值(undefined 可以 复制 void)
    "strictNullChecks": false
  }
}

compileOptions

  • target

    编译 Js 的版本, 默认为 ES3

    • ES3: 最广泛支持的版本
    • ES5: 大多数现代浏览器支持
    • ES6/ES2015: 引入了类、模块、箭头函数、Promise等新特性
    • ES7/ES2016: 引入了 Array.prototype.includes 和幂运算符
    • ES8/ES2017: 引入了 async/await
    • ES9/ES2018: 引入了异步迭代等特性
    • ES10/ES2019: 引入了 Array.prototype.flat 和 Object.fromEntries
    • ES11/ES2020: 引入了可选链和空值合并运算符
    • ES12/ES2021: 引入了 Promise.any 和逻辑赋值运算符
    • ES13/ES2022: 引入了类字段和顶级 await
    • ESNext: 编译为最新的 ECMAScript 版本, 包含所有新特性
  • jsx

    如何处理 JSX 语法

    • preserve: 保留 JSX 语法, 不进行转换, 通常与 babel 等工具链结合使用
    • react: 将 JSX 转换为 React.createElement 调用
    • react-jsx: 将 JSX 转换为 新的 JSX 转换器(React 17 及以上版本引入), 不再需要显式导入 React
    • react-jsxdev: 与 react-jsx 类似, 但用于开发模式, 提供额外的调试信息
  • module

    指定 TS 编译器生成的模块系统类型

    • commonjs: 适用于 Node.js 环境
    • es6/es2015: 使用 ES6 模块语法
    • esnext: 与 es6 类似, 但允许使用最新的 es 模块特性
    • amd: 异步模块定义, 主要用于浏览器环境, 使用 define 和 require
    • umd: 通用模块定义, 兼容 CommonJS 和 AMD, 适用于库的开发
    • system: 使用 SystemJS 模块加载器的模块格式
    • none: 不使用任何模块系统, 所有代码视为全局脚本

Released under the MIT License.