typescript模块导入与全局变量踩坑日志
背景
在调整typescript项目结构,全局变量尽量少用,但还是必不可少的,既要合理的引入,又要能用上vscode的智能提示。上篇日志已经记录了,在vscode中开发,全局变量的定义与声名是分开的,要做好对应。
需求描述
- 全局自定义工具类,本团队自主开发的小工具,需要能有智能提示
- 加入常用的第三方工具到全局,也需要能有智能提示
- 用bluebird替换全局Promise
源代码目录结构
- src/common/globUtils.ts,这是本团队自主开发小工具
- src/inits/global.ts,这是全局变量的代码定义文件
- src/globals.d.ts,这是全局变量声名文件
├── src │ ├── app.ts │ ├── common │ │ └── globUtils.ts │ ├── config │ │ └── log4js.ts │ ├── globals.d.ts │ ├── index.ts │ └── inits │ ├── global.ts │ └── tasks.ts ├── tsconfig.json ├── tslint.json
自定义工具模板
export default class GlobUtils { isDev() { return global.NODE_ENV !== 'prod' } }
注意事项:
- 导出时必须给出类名称, 不然vscode会提示出错。
- 其实这最好用静态方法,但vscode的智能提示会忽略掉静态方法,放弃。
- 在全局定义时,因为此处给出了类名,导入的是类,不是实例。
全局变量代码定义
import * as lodash from 'lodash' import * as Bluebird from 'bluebird' import GlobUtils from '../common/globUtils' export default { async init() { Object.assign(global, { ROOT_PATH: process.cwd(), NODE_ENV: process.env.NODE_ENV || 'dev', //dev - 开发; prod - 生产; test - 测试; Promise: Bluebird, __: lodash, globUtils: new GlobUtils(), }) } }
注意事项:
- import引入形式必须为 import * as lodash from 'lodash',vscode建议的形式会出错
- 用Object.assign来将新属性加到global上
- globUtils需要的是实例,注意几种导入形式,及默认导出时,类名给不给出,导入的结果是不同的,这里是类,需要new出实例来。
全局变量声名文件
import { Logger } from 'log4js' import GlobUtils from './common/globUtils' import * as lodash from 'lodash' type LODASH = typeof lodash declare global { namespace NodeJS { interface Global { logger: Logger, NODE_ENV: string, ROOT_PATH: string, globUtils: GlobUtils, __: LODASH, } } }
注意事项:
- 第一种导入方式,Logger引入类,直接声明为全局变量,import后已经实例化
- 第二种导入方式,lodash为命名空间,type LODASH声明为全局变量
- 第三种导入方式,GlobUtils为默认命名导出,import后为类,还未实例化
用bluebird替换全局的Promise
用@types/bluebird-global替换@types/bluebird,即可完成替换。我们只需要在代码定义中增加它的定义就好了。
注意事项:
- Promise直接调用,其它全局变量在global下,虽然在实际环境中,两个都存在,智能检测只认一边,这也有利于我们编码时区分全局变量。
代码地址
代码是这个项目的基础,此项目我准备将express+mysql的成功经验移植到koa2中来。
https://github.com/zhoutk/gels
使用方法
git clone https://github.com/zhoutk/gels cd gels git checkout 9ea084f yarn tsc -w 用vscode打开项目,并按F5运行
小结
终于迈入typescript坑中,痛并快乐着!
相关推荐
changcongying 2020-11-02
Java编程语言学习 2020-07-29
changcongying 2020-10-30
苗疆三刀的随手记 2020-10-29
zouph000 2020-10-25
Jruing 2020-10-23
ctg 2020-10-14
PMJ0 2020-10-13
ChaITSimpleLove 2020-10-06
小飞侠V 2020-09-25
QiaoranC 2020-09-25
changcongying 2020-09-17
taizuduojie 2020-09-15
淼寒儿 2020-09-13
lyjava 2020-09-11
彤庆的技术 2020-09-02
锅哥 2020-08-27
ruanhongbiao 2020-08-16
zouph000 2020-08-03