ts-node
使用 ts-node
来无需编译直接启动 ts 文件
使用方式(仅给项目单独使用的话不需要装在全局)
1 | npm i ts-node typescript -g |
问题
当在 typescript.json
中配置 alias
路径别名来做到快速跳转时,ts-node
并不认识这个别名是什么
1 | Error: Cannot find module '@/utils/format' |
原因:
ts-node
无法识别alias
, 毕竟这玩意严格意义来说属于webpack
ts-node
7.0.0 后不再支持自动识别tsconfig.json
了,且无法识别本地声明文件,需要添加--files
参数才能识别
解决
安装一个叫 tsconfig-paths
的包,修改启动 script
1 | npm i -D tsconfig-paths |
global 与 json 引入
global
NodeJS 中为 global 赋值时,会出现问题
1 | // TS7017: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature. |
需要手动创建一个声明文件,定义 global
上的参数
1 | // xxx.d.ts |
json 引入
直接引入 json 会出现类型错误(其实不止 json
,scss
也一样,但处理方式基本都类似)
1 | // TS2732: Cannot find module '../package.json'. Consider using '--resolveJsonModule' to import module with '.json' extension. |
解决方式同样是新建一个声明文件
1 | // xxx.d.ts |
eslint 无法识别类型文件
定义了这么一个类型文件
1 | // xxx.d.ts |
使用时被 eslint 报了错
1 | // ESLint: 'Env' is not defined.(no-undef) |
在 .eslintrc.js
中,无须愧疚的关掉这个规则,因为它提供的检查已经由 TypeScript
提供了,而且 TypeScript
做的比它更好
1 | { |
eslint 诡异的报错
普通的一天写了个普通的 class 报了个普通的错
1 | class ChromeDriver { |
当时的 .eslintrc.js
1 | module.exports = { |
都写 TypeScript 自然要用针对 TypeScript 的解析器才行,ESLint 对 TypeScript 的解析器用的是 @typescript-eslint/parser
,修改 .eslintrc.js
1 | module.exports = { |
别忘了下载这个解析器
1 | npm i @typescript-eslint/parser -D |
编译 TypeScript 项目
对于 NodeJS 应用,开发完毕后需要手动将 TypeScript 编译为 JavaScript,此时需要转换代码中的 alias
别名。
默认情况下 TypeScript 的编译器无法转换 alias
别名,我们借助插件 typescript-transform-paths
,它可以将项目中的别名转换为正确的路径。
1 | # 安装 typescript-transform-paths |
修改 tsconfig.json
,配置插件实现自定义转换器:
1 | { |
但目前 TypeScript 不支持 tsconfig.json
中的自定义转换器,即不支持通过 tsc
命令使用自定义转换器编译文件。
因此这里需要借助一个工具 ttypescript
。TypeScript 允许通过编程方式来使用自定义转换器,该工具借助此特性自行提供了 ttsc
命令来解决 tsc
无法使用自定义转换器的问题。
该工具使用本地安装的 TypeScript,因此需要保证同步安装 TypeScript
,无版本限制。
1 | # 安装 ttypescript |
像使用 tsc
一样的方式编译 TypeScript 文件
1 | ttsc |
需要注意的是,
typescript-transform-paths
无法识别import(\)
中的别名