在上一章中,我们介绍了TSC工作,但是并没有完整的走完一个使用流程,本文,我们通过一个add函数来学习编写TS代码的流程。
在编码之前,是需要配置好TSC的配置文件tsconfig.json
,
执行tsc --init
初始化项目,自动生成tsconfig.json
文件,并默认配置项。
对于一个前端项目,肯定是分文件夹的。例如:我们的代码可能是放在src下面,如果有使用npm拉取使用第三方包,会生成node_modules
文件夹。src我们是需要编译的,但是node_modules
是不需要编译的,我们就需要将node_modules
排除掉,就像是webpack打包也会配置排除node_modules
TSC提供了include
和exclude
来配置编译和忽略文件。
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"strict": true,
"skipLibCheck": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
]
}
tsc --noEmit --watch
此时你会在控制台发现,报错了,没有关系,这是因为我们还没有TS文件。
No inputs were found in config file '/tsconfig.json'. Specified 'include' paths were '["src/**/*"]' and 'exclude' paths were '["node_modules"]'.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkcUqR89-1655361768404)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b404f182bc734fd1bb4aa781720ece44~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
在src文件夹下,我们创建一个app.ts文件,编写一段纯JS代码,实现两数相乘*2。
function multi(a,b){
return a*b *2
}
当你写完这段代码,TS会立即进行类型推断,并且给出警告。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-90KnTidH-1655361768405)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4ffdb47bba124dcfb8bcb2e642b0b52d~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
ps: 如果你是VScode,参数下面会出现红色波浪线,鼠标放上去会出现具体的提示!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDYTyF4d-1655361768405)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e4e69e77e4124f78a6667dc45abbab7c~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
这个提示的意思就是,虽然我们自己觉得参数a和参数b是数字,但是在实际的使用中,可能是其他类型的值。
如果你是VSCode,你可以使用下面的快速修复。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXo49GBR-1655361768405)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0403d1e455014a3cbe6ce5807acc8da8~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
你会得到下面的代码,这就是TS的用法,参数后面加:类型
。这就是类型推断的作用,TS根据我们的函数体的内容,自动推断出参数的类型都是number
类型。
function multi(a: number,b: number){
return a*b *2
}
当我们仍然使用不加类型的写法。
function multi(a,b){
return a*b *2
}
const result=multi(2,3)
const result1=multi(2,'3')
你会发现,此时控制台并不会报错,也就是说,我们可以传除了数值类型以外的其他类型的值。
当我们使用加上类型的代码,控制台会报错。
Argument of type 'string' is not assignable to parameter of type 'number'.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vb40FQCa-1655361768406)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/711c4308a90a48afa36fea30f6cda8c5~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
这就是使用TS的好处,他会提醒我们变量的类型,避免传递无效参数。
因为浏览器是无法直接运行TypeScript的,所以我们就需要将TS编译成JS。
在编译之前我们需要配置编译后代码存放位置(默认是与被编译文件同级目录下。)
{
"compilerOptions": {
"outDir": "./dist", // 指定输出目录为dist
}
}
app.ts
function multi(a,b){
return a*b *2
}
在命令行执行
tsc
此时控制台报错,但是编译成功。会生成dist/app.js.
最终编译的的结果:
TS编译之后自动加上严格模式,当然这个也可以通过配置去掉!
"use strict";
function multi(a, b) {
return a * b * 2;
}
function multi(a: number,b: number){
return a*b *2
}
编译结果如下:
"use strict";
function multi(a, b) {
return a * b * 2;
}
与上面的结果一致。TS编译其实就是去掉所有的TS语法,比如类型。
上面在编译普通JS的时候,是报错的,但是仍然可以成功编译。如果我们想报错无法编译。
只需要加上配置项即可!
{
"compilerOptions": {
"noEmitOnError": true,
}
}