目录
环境
IDE: Visual Studio Code 1.69.1
npm 8.1.2
node 16.13.2
tsc 4.7.4
初学者补充说明:
tsc -init 生成tsconfig.json
tsc /fileA/xxx.ts 生成xxx.js文件到outDir指定目录下fileA/xxx.js
node /outDir目录/fileA/xxx.js 执行xxx.js文件
可同时使用多条命令:
tsc /fileA/xxx.ts; node /fileA/xxx.js
多条命令之间用分号';' 进行分割
一、tsconfig.json
"strict": true 启用所有严格的类型检查选项。
若不需要启用严格检查则为false。
"outDir": "./js"//你要生成js的目录
ctrl + ` 启动终端:执行tsc --watch 开启监听ts改动同步js变化
ctrl + shift + ` 开启一个新的终端
二、tsc --watch监听同步变化问题
2.1 空类无法生成对应的js文件
2.2 删除ts文件不会同步删除js文件
2.3 修改ts文件名问题
修改ts文件名后vscode会同步打开所有import了这个ts类的文件,让你手动去保存,才能同步到所有对应的js文件的import改动。
未修改前叫 FoodApple.ts
修改后脚 foodapple.js 会打开main.ts文件(它引用了FoodApple.ts)让你手动保存,所有文件都要你手动保存一遍才能同步js,如果你这时候直接关闭vscode,并不会同步,js的代码会和你ts代码的有不同地方,除非你再去修改对应的ts保存才会同步生效。
注意import对应的是文件名foodapple.ts(不是里面的类名FoodApple不会有影响)
同时修改文件名会新增一个js(即新文件名.js) 同时旧js文件不会同步删除 需要你手动删除。
2.4 修改ts文件的文件夹名称问题
修改一个文件夹名后,涉及到该文件夹名的所有import的文件都会被vscode打开,让你手动保存,一个个保存后才会同步js,并且js目录下的文件夹名称不会同步修改,需要你手动修改JS文件夹名。如下未修改前和修改后
三、import自动导入类路径异常问题
3.1 同名ts类问题
如果发现自动导入没有正常进行,或者导入了但是使用这个类一直存在异常报错,那一定是存在同名ts类。(编译是通过的)
四、剩余参数问题 ( ...params:any )
猜猜输出什么?
.
.
.
.
是的!funcA获取到的是一个any[],一共4个分别是1, "a", true, 3.14。
funcBBB获取到的是一个any[],但是,调用者funcA处只传递了一个参数即([1, "a", true, 3.14])any数组。所以输出的是1,a,true,3.14。因为它就是个数组(元组?)
若你想funcBBB获取到也是和funcA一样的情况,只需把funcBBB(...params:any)改成funcBBB(params:any)即可。
总结: ...是剩余参数的关键字,被这个剩余参数关键字标记的参数,并不是什么特殊的类似C#的那种,仅仅可直接理解为...params:any 等同于 any数组,但是它比直接定义any[]好处是能够让调用者传递任意多个any进去再封装成数组,并且默认是可为空的 也就是你可不传任何参数。然后,当你想继续传递这个...标记的参数params时,切记!切记!传递进去的方法这个参数不要再用...剩余参数关键字去定义了,不然的话就相当于你把params数组传递给了一个新的数组,那么你传递进去的方法体里只能用参数[0]去获取到传进来的数组。
有些地方不理解...的使用方法,可能会有人定义成: ...params:any[],但是传给它的却不是any[],只是单个变量,其实这是有问题的,按照我的理解是有问题的,按道理是会报错的,如果使用者把params[0]当做了数组去使用的话,但实际拿到的却是一个单个变量 比如int。肯定就报错了嘛。
ts + js + vscode + git 简直能坑出天际~
五、JSON jsonObj转string问题
Map<key,value>无法成功转string必须将其通过改写为{ [key]=value } 形式才能成功转string
例如:
let json : any = {};
for(let key of map.keys()){
json[key] = map.get(key);
}
JSON.stringify(json, null, 1); 输出完整的字典json字符串(后面2个参数是为了显示缩进后的json)
六、declare修饰符
重定义类成员(相当于重写类成员)重写方法用override(也可以不用)
七、if(xxx)和if(xxx!=null)区别
0、false、"" 这三个数据无法通过if(xxx)条件,可通过if(xxx!=null)条件,所以判空一定要写if(xxx!=null)
八、参数默认值和可空参数区别
正常参数默认值使用
不正常使用
猜猜输出是什么?BFunc执行AFunc时传入的是2个null值,AFunc是否会转化为默认值?因为我传空了嘛,它会不会帮我填上默认值?哎别猜了,不会!直接输出null
怎么办?用可空参数解决!
是的!可空参数 和 参数默认值为null 是不一样的概念!虽然都理解为是空,但ts执行时还是有这个坑爹的区别,可以说尽量别写默认值null的参数默认值,只要你参数默认值是null,你就乖乖地写可空参数 形式 param?: type
九、数组[[0]]的坑爹用法
let data = [[0]];
外部可直接用data[0]取出来进行运算,但是但是!这取出来的是一个string,因为我用它进行+一个number时会拼接字符,而不是做加法运算,一定要用data[0][0]进行获取(不要偷懒)