// tsconfig.json
{
  /**
   * 继承其他tsconfig.json文件
   * 相同属性会被当前配置覆盖,特别的 references 字段不会被覆盖
   */
  // "extends": "",

  /**
   * 入口文件,在指定目录时,只有指定目录下的文件才会被ts扫描
   * 此时在指定目录外的类型文件会不起作用,将自定义的 .d.ts 文件或类型文件存放路径放入这里面即可
   */
  // "include": ["types/**/*"],
  "compilerOptions": {
    // ---------------------可能会修改的配置----------------------

    // 编译过程中需要引入的库文件的列表,如果有些方法没有提示可以使用这个引入
    "lib": ["ESNext"],

    // 生成sourceMap
    "sourceMap": true,

    // 目标js的版本
    "target": "ESNext",
    // 目标代码的模块结构版本
    "module": "ESNext",
    // ts的模块解析策略, 根据 module 的不同选择不同, Bundler 模式无效的也可以改成 node 模式
    "moduleResolution": "bundler",
    // 编译输出文件所在路径
    "outDir": "./dist",

    // 是否生成声明文件
    "declaration": false,
    // 生成的声明文件路径
    // "declarationDir": "./dist/types",

    // 不要输出js文件
    "noEmit": false,
    // 允许导入ts文件
    "allowImportingTsExtensions": false,

    /**
     * 设置类型声明文件所在根目录,默认包含 node_modules/@types 下的所有类型
     * 如果修改了则只包含自定义设置文件夹中的类型
     */
    // "typeRoots": ["./my-types"],

    /**
     * 此选项只是控制是否你的项目中添加全局声明和导出不会出现再自动导入的建议中, 但是手动导入的包还是会有相应的类型声明
     * 当 types 被指定, 则只包含 typeRoots 设置的文件夹中被 types 指定的声明
     * 如 typeRoots 为默认值时,下面这个设置则只包含 node_modules/@types/node 和 node_modules/@types/express 和 vite-plugin-glslc 插件 ext 文件夹下的类型声明
     * "@types/three/examples/jsm/Addons.d.ts" 使用 ts 编写 threejs 代码 OrbitControls 等类型无提示这样解决
     */
    // "types": ["node", "express", "vite-plugin-glsl/ext", "@types/three/examples/jsm/Addons.d.ts"],

    // ------------------------------------------------------------

    /**
     * 定义当前项目根目录,此值相对于当前 tsconfig.json 文件所在目录
     * 比如下面的 ./ 表示 tsconfig.json 所在目录
     */
    "baseUrl": "./",

    // 允许有执行不到的代码,默认以建议的形式进行提示
    // "allowUnreachableCode": false,

    // 确保 switch 语句中的任何非空 case 都包含break、return或throw
    "noFallthroughCasesInSwitch": true,

    // 启用此标志等同于启用所有严格模式系列选项
    "strict": true,

    // -----------下面是严格模式系列选项-------------

    // 确保你的文件在 ECMAScript 严格模式下进行解析,并为每个源文件添加 "use strict"
    // "alwaysStrict": false,

    // 在表达式和声明上有隐含的 any类型时报错。
    // "noImplicitAny": true,

    // 对具有隐含 “any” 类型的 “this” 表达式引发错误。
    // "noImplicitThis": false,

    // 当设置此选项时,TypeScript 将检查函数的内置方法call、bind和apply在调用底层函数时是否使用了正确的参数
    // "strictBindCallApply": false,

    // null、undefined检查,当使用一个可能为 null、undefined 的字段a,谁用 a.test 输出错误提示
    // "strictNullChecks": true,

    // 当设置为 true 时,如果在类中声明了属性但在构造函数中未设置该属性,TypeScript 将引发错误
    // "strictPropertyInitialization": false,

    // 启用时,此标志会使函数参数的检查更加准确, https://www.typescriptlang.org/zh/tsconfig/#strictFunctionTypes
    // "strictFunctionTypes": false,

    // 在 TypeScript 4.0 中,添加了支持,允许将 catch 子句中变量的类型从any更改为unknown https://www.typescriptlang.org/zh/tsconfig/#useUnknownInCatchVariables
    // "useUnknownInCatchVariables": false,

    // 内置迭代器使用未定义的TReturn类型而不是any进行实例化
    // "strictBuiltinIteratorReturn": false,

    // --------------------------------------------

    // 重写一个类中的函数必须携带 override 否则报错
    "noImplicitOverride": true,

    // 是否对于对象中的未知字段必须使用索引语法
    "noPropertyAccessFromIndexSignature": true,

    // 是否为具有未知键但值的类型已知的对象添加 undefind 类型
    "noUncheckedIndexedAccess": true,

    // 报告未使用的局部变量错误
    "noUnusedLocals": false,

    // 报告函数中未使用参数的错误
    "noUnusedParameters": false,

    // 支持别名导入 为 true 时,字段 allowSyntheticDefaultImports 默认为 true
    // import * as React from "react"
    "esModuleInterop": true,

    // 当设置为 true, 并且模块没有显式指定默认导出时 import * as React from "react";可以写为 import React from "react";
    "allowSyntheticDefaultImports": true,

    /**
     * 提供一种在解析模块时覆盖默认文件名后缀列表的方法
     * 在当前设置下,对于 import * as foo from "./foo";
     * 对应查找以下文件  ./foo.ios.ts, ./foo.native.ts, 最后查找 ./foo.ts
     */
    // "moduleSuffixes": [".ios", ".native", ""],

    // 修改导入的模块路径
    // "paths": { "jquery": ["node_modules/jquery/dist/jquery"] },

    // 启用该选项允许导入 JSON,并验证该 JSON 文件中的类型
    "resolveJsonModule": true,

    // 删除注释
    "removeComments": true,

    // 保留 const和 enum声明
    "preserveConstEnums": true,

    // 额外支持解构/forof等功能
    "downlevelIteration": true,

    /**
     * 对于某些降级行为,TypeScript 使用一些辅助代码来进行操作。例如继承类,展开数组或对象,以及异步操作。 默认情况下,这些辅助代码被插入到使用它们的文件中。 如果在许多不同的模块中使用相同的辅助代码,则可能会导致代码重复。
     * 如果启用了 importHelpers 选项,这些辅助函数将从 tslib 中被导入。
     * 要是用这个配置请确保安装了 tslib 依赖到运行依赖。
     */
    // "importHelpers": false,

    // 允许 JavaScript 文件在你的工程中被引入,而不是仅仅允许 .ts 和 .tsx 文件
    "allowJs": true,

    // 与 allowJs 配合使用,当 checkJs 被启用时,JavaScript 文件中会报告错误。也就是相当于在项目中所有 JavaScript 文件顶部包含 // @ts-check。
    "checkJs": false,

    // TypeScript 将会在当你写的某些代码不能被单文件转译的过程正确处理时警告你
    "isolatedModules": true
  }
  // 被包含文件,少量文件可以用,文件数量多还是使用 include 字段进行匹配
  // "files": ["core.ts"],

  /**
   * 指定 include 中要被排除的文件(夹)
   */
  // "exclude": ["node_modules"]
}
