TypeScript并不是什么高深的技术,它只是javascript的超集,那么什么是超集呢?所谓超集其实就是把你写的TypeScript最后编译成javascript执行,因为浏览器上能运行的脚本语言就是javascript。这个的本质是理解传统的Javascript。缺点:1.弱类型,不严谨,不能写在检测同一个变量的类型是否一致时,例如:vara=1//如果b的值为“1”,则字符串varb="1"console.log(a+b)result:2.No依赖插件,无法感知编码写法是否有边际错误(某时刻空值等),尤其是有ES6之前都是全局变量,var会给全局状态加上属性污染全局环境,加上ES5变量提升作用域等混合情况,很容易造成查找变量时undefined的问题,不过这个问题需要代码运行报错。例如:vara;functiontest(){a=1}console.log(a)//undefinedconsole.log(window.a)//undefined------------------vara;functiontest(){a=1}test()console.log(a)//1console.log(window.a)//1像上面的情况,如果遇到上面的情况,项目很大,而且排错还是很烦人的。往往在这种后端类型的代码中,高并发场景下的一个小问题就是致命的。如果是超大型项目,排查问题难度很大。在传统的javascript代码中,变量a根本没有定义,但是没有报错,这种场景可能是项目中的正确查询可能查询不到,然后输出undefined。但是如果你是在用这个变量做一些事情,比如:这个变量是一个用户的很核心的数据,但是它是undefined。然后经过几次类型转换,由js转换成未知数据展示给客户。如果炸了,可能会导致整个项目出现致命错误,直接崩溃。4.大型项目,多人合作,如果某事经常找bug可能会浪费大家很多时间(钓鱼时间)。比如:你的同事A写了一个模块,大概5个文件,1000行代码处理后一共1000行代码,最后输出几个值(变量)给你有如下代码:exportdefault{store,checkPassWord,applyMiddleWare,//....}一个不合格的同事给了你未注释的代码,所以你:/Applymiddleware*/exportdefault{store,checkPassWord,applyMiddleWare,//....}如果你用他暴露的对象,内容很多,就得一一看注释,关键是:各个函数的传入参数、返回参数、注释不一定那么完整详细。然后才去沟通,一旦沟通。时间成本越来越高,如果大家的开发任务特别紧急,就会爆发~所以,TypeScript出现了TypeScript3.1现已发布最新版本文档地址TypeScript最新版本文档地址TypeScript不能说是全新的语言,可以说是基于javaScipt的超集什么是超集?其实就是ES6原生语法+Type类型。强烈推荐阅读阮一峰老师的ES6入门。我们来看看TypeScript的工作方式:全局下载TypeScript,手动将ts文件编译成js文件,npminstall-gtypescript,使用全局安装的typescript编译输出刚才的文件还没有编译,现在已经开始报错了,报错还能继续编译?即使静态验证有问题,最后还是编译成功:这里要特别注意,TS中的静态类型,还有枚举等,编译成js后是不存在的。以上并不能体现typeScript的特殊价值。TypeScript的核心原则之一是对值的结构进行类型检查。它有时被称为“鸭子类型”或“结构子类型”。在TypeScript中,接口的作用是命名这些类型并为您的代码或第三方代码定义契约。//接口名称为LabeledValueinterfaceLabeledValue{label:string;}//函数传入的参数labeledObj遵循LabeledValue接口函数printLabel(labelledObj:LabelledValue){console.log(labelledObj.label);}letmyObj={尺寸:10,标签:“尺寸10对象”};printLabel(myObj);上面的代码经过ts编译后,所有接口和静态类型都没有了:functionprintLabel(labelledObj){console.log(labelledObj.label);}varmyObj={size:10,label:"Size10Object"};打印标签(我的对象);如果在写代码阶段ts出现类型校验错误,会直接提示:我把接口的string改成number类型了。我们只要改变接口的类型,一旦知道了错误就立刻检测出来,这样就不用等到开发模式下热更新调试了再报错。当然,当你定义一个接口时,你可以添加一个?在变量后签名。这是一个可选属性。例如:interfaceSquareConfig{color?:string;width?:number;}functioncreateSquare(config:SquareConfig):{color:string;area:number}{letnewSquare={color:"white",area:100};如果(config.color){newSquare.color=config.color;}if(config.width){newSquare.area=config.width*config.width;}returnnewSquare;}letmySquare=createSquare({color:"black"});还有只读属性的接口定义:interfacePoint{readonlyx:number;readonlyy:number;}可以通过Assign一个对象字面量来构造一个Point。赋值后,x和y不能再改变。让p1:点={x:10,y:20};p1.x=5;//错误!比较常用的函数类型检查,先写接口interfaceSearchFunc{(source:string,subString:string):boolean;}定义函数letmySearch:SearchFunc;mySearch=function(source:string,subString:string){let结果=source.search(subString);returnresult>-1;}对于函数类型的类型检查,函数的参数名称不需要与接口中定义的名称相匹配。例如,让我们使用以下代码重写上面的示例:returnresult>-1;}函数的参数会一一检查,要求对应位置的参数类型兼容。如果不想指定类型,TypeScript的类型系统会推断参数类型,因为函数是直接赋值给SearchFunc类型变量的。函数的返回类型是根据其返回值推断的(在本例中为false和true)。如果我们让这个函数返回一个数字或字符串,类型检查器会警告我们该函数的返回类型与SearchFunc接口中的定义不匹配。letmySearch:SearchFunc;mySearch=function(src,sub){letresult=src.search(sub);}returnresult>-1;}鸭式判别是指:一个动物看起来像鸭子,听起来也像鸭子,所以可以认为是鸭子定义类的一种类型:interfaceClockInterface{currentTime:Date;setTime(d:Date);}classClockimplementsClockInterface{currentTime:Date;setTime(d:Date){this.currentTime=d;}constructor(h:number,m:number){}}一个接口可以继承多个接口,创建多个接口的复合接口。interfaceShape{color:string;}interfacePenStroke{penWidth:number;}interfaceSquareextendsShape,PenStroke{sideLength:number;}按照脚本写了这么多,其实这些都是TS最有用的地方。文档写的很好,建议多看几遍,前提是你一定要学好ES6!在TS中,我们要尽量避免使用任何类型。任何类型都有太多不可预测的后果。functionidentity
