typescript node.js

参考资料

TypeScript简称TS,是微软(MS)开发的自由和开源的编程语言,是JavaScript(JS)的严格超集,添加了可选的静态类型和基于类的面向对象编程。TS的设计目标是开发大型应用,然后转译为JS运行。由于TS是JS的超集,任何现有的JS程序都是合法的TS程序。

TS作为JS的超集,TS文件经过tsc编译后形成JS文件,TS支持ES6标准。TS通过类型注解提供编译时的静态类型检查。

目标

  • 使用TypeScript开发Node.js应用程序

Node.js

Node.js本身只是一个可以运行JavaScript代码的运行环境,基本上可认为Node.js是由V8 +libuv组成,V8用于解释JavaScript代码,libuv处理异步模型。

环境检查

$ node -v
v14.16.0

$ npm -v
6.14.11

创建项目目录并进入

$ mkdir ts && cd ts

使用Node.js包管理器NPM初始化项目骨架,生成项目依赖包配置文件package.json

$ npm init -y

package.json

配置编译和运行脚本

  • 使用npm run start编译src目录下的*.ts源码生成到dist目录下的*.js文件后运行*.js文件
$ vim package.json
{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "build/index.js",
  "scripts":{
    "test": "echo \"Error: no test specified\" && exit 1",
    "start":"tsc && node build/index.js"
  },
  "dependencies": {
    "typescript": "^4.2.4"
  },
  "devDependencies": {},
  "keywords": [],
  "author": "",
  "license": "ISC"
}
  • package.jsonscripts属性用于配置指令集合,配置后可使用npm run *运行在scripts节点下配置的指令。
"start":"tsc && node build/index.js"

@types/node

由于开发环境的Node.js,为适应合适的类型校验和代码提示,需引入Node.js的类型文件。

安装@types/node包让TypeScript支持Node.js内置模块

$ npm i -S @types/node

TypeScript

利用npm全局安装TypeScript编译器

$ npm i -g typescript

查看TypeScript编译器版本

$ tsc -v
$ tsc --version
Version 3.5.3

查看帮助文档

$ tsc --help

更新TypeScript版本

$ npm update -g typescript

为当前项目安装TypeScript依赖包

$ npm i -S typescript

TypeScript文件以.ts作为文件扩展名

  1. 使用TypeScript编译器tsc命令将.ts文件转换为.js文件后
  2. 再使用node命令运行.js文件
$ vim test.ts
var message:string = "hello world"
console.log(message)
$ tsc test.ts
$ node test.js

tsconfig.json

生成TypeScript编译器配置文件tsconfig.json,当TypeScript编译器在编译*.ts文件时会使用项目根目录下的tsconfig.json,根据tsconfig.json文件中的配置项执行编译。默认若tsconfig.json中没有任何配置,则TypeScript编译器会默认从编译项目目录下找到所有的.ts.tsx.d.ts文件。

$ tsc --init

配置TypeScript编译器选项

$ vim tsconfig.json
"outDir":"./build",
"rootDir":"./src",

创建源代码目录和编译输出目录

$ mkdir src && mkdir build\

创建测试代码

$ cd src
$ vim index.ts
const message:string = "hello world";
console.log(message);

使用TypeScript编译器编译*.ts源码,编译后会在outDir目录下生成*.js文件。

$ tsc index.ts

使用node命令运行*.js文件获取最终结果

$ cd .. && cd build
$ node index.js

创建TypeScript配置文件进行项目初始化

  • 执行tsc --init命令后将自动在当前目录下生成tsconfig.json配置文件
  • tsconfig.json文件所处路径是当前TS项目的根路径。
$ tsc --init

配置使用

  • 不带任何输入文件的情况下调用tsc命令,编译器会从当前目录 开始查找tsconfig.json文件,并逐级向上搜索父目录。
  • 不带任何输入文件的情况下调用tsc命令,且使用命令行参数--project-p指定一个包含tsconfig.json文件的目录。

配置选项

  • tsconfig.json配置文件主要包含两块内容:指定待编译的文件、定义编译选项。
$ vim tsconfig.json
{
  "compilerOptions": {
    "target": "esnext", 
    "module": "esnext",
    "lib": ["es2016", "dom"],
    "outDir": "./build",
    "rootDir": "./src", 
    "strict": true, 
    "moduleResolution": "node",
    "esModuleInterop": true,"skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "exclude":["node_modules"]
}

编译器选项

  • target TS编译后生成的JS文件所需遵循的ES标准,候选项为ES3ES5ES2015ES2016...
  • module 遵循的JS模块规范,候选项为commonjsAMDES2015...
  • outDir 编译输出的JS文件存放的文件夹
  • esModuleInterop 是否允许从没有设置默认导出的模板中默认导入,此配置并不影响代码的显示,仅仅时为了类型检查。
  • lib项目中使用的语法类库,比如使用consoledom类库,使用Symbol需添加es2015类库等。

其他选项

  • include 编译时需要包含的文件夹
  • exclude 编译时需要剔除的文件夹

ts-node

针对TypeScript还需要ts-node包的支持。

$ npm i -D ts-node
  • ts-node包用于在Node.js环境下直接运行TypeScript文件获取结果
$ ts-node src/index.ts

nodemon

没有热更新修改完代码后是不会立即自动重启生效的,实现热更新可采用nodemon包实现。

$ npm i -D nodemon
  • nodemon包专门针对在开发期间自动重启Node.js应用程序

热更新命令

$ nodemon -e ts --exec ts-node src/index.ts
  • -e ts表示监听TypeScript文件
  • --exec ts-node表示需要使用ts-node来编译代码
$ nodemon -w src/ -e ts-node ./src/index.ts

热更新命令表示使用nodemon监控src/下所有的TypeScript文件的改动,当发生改动时直接使用ts-node重新生成index.ts

配置自定义脚本命令

$ vim package.json
"scripts": {
  "start": "nodemon -e ts --exec ts-node src/index.ts"
},

执行热更新

$ npm run start

TypeScript Tips

如何在TypeScript中import导入JSON文件呢?

解决的方式在项目根目录下的tsconfig.json即TypeScript编译器配置文件中,设置compilerOptions编译编译器选项下的resolveJsonModule属性为true即可。

$ vim tsconfig.json
{
  "compilerOptions": {
    "resolveJsonModule": true,
  }
}

然后在需要导入JSON文件的位置添加ES6模块规范的导入写法

import * as pkg from "package.json"

运行脚本出现错误信息:无法在模块外使用import语句,因为模块加载实现的ES6的语法。

Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
SyntaxError: Cannot use import statement outside a module

如何为TypeScript设置路径别名(路径映射)呢?

Vue项目中可利用@来指代src目录,通过配置TypeScript的tsconfig.jsoncompilerOptions下的paths属性,可告知TypeScript编译器,在解析路径是将同意将src解析为baseUrl下的src目录。

$ vim tsconfig.json
{
  "compilerOptions": {
    "paths":{
      "@/*":["src/*"],
      "*":["./node_modules/*", "./typings/*"]
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容