nodejs项目typeScript改造记录

584 阅读3分钟

一.安装配置typeScript

1.安装typeScript

    npm i typescript -D // 安装到开发环境

2.安装ts-node,ts-node是typeScript的执行环境,可以直接执行ts代码

    npm i ts-node -D

3.在根目录创建tsconfig.json文件

{
  "compilerOptions": {
    // "incremental": true,                   /* 增量编译 提高编译速度*/
    "target": "ESNext",                       /* 编译目标ES版本*/
    "module": "commonjs",                     /* 编译目标模块系统*/
    "rootDir": "./src", 
    // "lib": [],                             /* 编译过程中需要引入的库文件列表*/
    "declaration": true,                      /* 编译时创建声明文件 */
    "outDir": "./dist",                         /* ts编译输出目录 */
    "baseUrl": "./",
    "paths": {
        "@/*": ["src/*"],
    },
    // "importHelpers": true,                 /* 从tslib导入辅助工具函数(如__importDefault)*/
    "strict": true,                           /* 严格模式开关 等价于noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply等设置true */
    "noImplicitAny": false,
    "noUnusedLocals": true,                   /* 未使用局部变量报错*/
    "noUnusedParameters": false,               /* 未使用参数报错*/
    "noImplicitReturns": true,                /* 有代码路径没有返回值时报错*/
    "noFallthroughCasesInSwitch": true,       /* 不允许switch的case语句贯穿*/
    "moduleResolution": "node",               /* 模块解析策略 */
    "typeRoots": [                            /* 要包含的类型声明文件路径列表*/
      "typings",
      "node_modules/@types"
      ],                     
    "allowSyntheticDefaultImports": true,    /* 允许从没有设置默认导出的模块中默认导入,仅用于提示,不影响编译结果*/
    "esModuleInterop": true,                  /* 允许编译生成文件时,在代码中注入工具类(__importDefault、__importStar)对ESM与commonjs混用情况做兼容处理*/
    "sourceMap": true
  },
  "include": [                                /* 需要编译的文件 */
    "src/*",                              
  ],
  "exclude": [                                /* 编译需要排除的文件 */
    "node_modules/**",
    "./dist"
  ],
}

4.将所有.js文件改为.ts文件

二、配置Eslint

1.安装依赖

 npm i eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin -D

2.添加.eslintrc.json文件

{
  "env": { // 指定想启用的环境
    "es6": true,
    "node": true
  },
  "extends": [  // 配置文件可以在已有配置的基础上进行扩展,extends 用于指定基础配置
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended"
  ],
  "globals": { // 使用未在当前文件中定义的全局变量时,会命中 no-undef 规则,通过 globals 配置指定的全局变量无视 no-undef 规则。
    "Atomics": "readonly",
    "SharedArrayBuffer": "readonly"
  },
  "parser": "@typescript-eslint/parser", // 指定 ESLint 使用的语法分析器
  "parserOptions": { // 指定语法分析器选项,默认使用的语法分析器支持如下几个选项:ecmaVersion、sourceType、ecmaFeatures。
    "ecmaVersion": 2018,
    "sourceType": "module"
  },
  "plugins": [ // 插件是第三方定制的规则集合,plugins 参数用于指定第三方插件,插件名中的 eslint-plugin- 前缀可以省略。
    "@typescript-eslint"
  ],
  "rules": {
    // "indent": [ "warn", 2 ], // 缩进风格
    "no-unused-vars": 0 // 不允许有未使用的变量
  }
}

三、其他

1.安装@types/node

   npm i @types/node -D // @types/node包含了node.js的类型定义

2.模块改造参考TypeScript: Documentation - Modules (typescriptlang.org)

 一般像koa的模块没有ts文件,使用的commonjs导出的js模块,所以没法用ts进行类型检测,所以要使用声明文件来处理这个问题。
  • 安装@types/koa
    npm i @types/koa -D

3. typescript 错误信息列表项目配置 - 错误信息列表 - 《TypeScript 官方文档》 - 书栈网 · BookStack

4.目录结构

- 📁dist 编译后的文件

- 📁assets 存放项目的图片、视频等资源文件

- 📁src 源码目录

    - 📁controller api入口

    - 📁mongodb 数据库

        - 📄db.ts 连接数据库

    - 📁middlewares 中间件

        - 📄jwt.ts 鉴权

        - 📄response.ts 封装响应

    - 📁service 业务逻辑层
    
    - 📄app.ts 入口文件

- 📄.eslintrc.json eslint配置

- 📄tsconfig.json typeScript配置

- 📄README.md 项目说明

5.项目运行

  • 运行报错ERR_UNKNOWN_FILE_EXTENSION
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for XXX
    at new NodeError (internal/errors.js:322:7)
    at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:71:15)
    at Loader.getFormat (internal/modules/esm/loader.js:105:42)
    at Loader.getModuleJob (internal/modules/esm/loader.js:243:31)
    at async Loader.import (internal/modules/esm/loader.js:177:17)
  code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
  • 修改package.json文件
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "ts-node -T src/app.ts"
  },
  
  • 然后运行npm start就可以了 最后就是补充interface消除any