本文转载自微信公众号《JS每日一问》,作者慧慧。转载本文请联系JS每日一问公众号。1.这是什么?typescript类型声明中除了string、number、boolean等基本类型外,还有一些高级类型。这些高级类型的应用是typescript为了保证语言的灵活性而使用的一些语言特性。这些特性帮助我们应对复杂多变的开发场景2.常见的高级类型有哪些如下:交集类型联合类型类型别名类型索引类型约束映射类型条件类型交集类型通过&将多个类型合并为一个类型,包含所有需要的特征类型,并且本质上是一个联合操作。语法如下:T&U适用于对象合并场景。一个函数将声明如下,将两个对象合并为一个对象并返回:functionextend(first:T,second:U):T&U{letresult:={}for(letkeyinfirst){result[key]=first[key]}for(letkeyinsecond){if(!result.hasOwnProperty(key)){result[key]=second[key]}}returnresult}联合类型联合类型的语法规则与逻辑“或”符号,表示其类型是相连类型中的任意一种,本质上是一个相交关系的语法如下:T|U比如number|的类型字符串|boolean只能是这三种类型之一,不能共存如下:functionformatCommandline(command:string[]|string){letline='';if(typeofcommand==='string'){line=command.trim();}else{line=command.join('').trim();}}类型别名类型别名给类型一个新的名字,类型别名有时类似于接口,但可以应用于原始值,union类型、元组和您需要手写的任何其他类型。可以使用typeSomeName=someValidTypeAnnotation的语法来创建类型别名:typesome=boolean|stringconstb:some=true//okconstc:some='hello'//okconstd:some=123//Type'123'cannotbeassignedtotype'some'类型别名也可以是通用的:typeContainer={值:T};也可以在属性中使用类型别名来引用自己:typeTree={value:T;left:Tree;right:Tree;}可以看到类型别名和接口的使用是非常相似,都可以描述一个对象或函数。两者最大的区别是接口只能用来定义对象类型,而类型声明方法除了对象之外还可以定义交集、联合、原始类型等,类型声明的适用范围方法显然更广泛。类型索引keyof类似于Object.keys,用于获取一个接口中Key的联合类型interfaceButton{type:stringtext:string}typeButtonKeys=keyofButton//相当于typeButtonKeys="type"|"text"的类型constraint是通过关键字extend来约束的,区别于class后使用extends的继承功能。泛型中主要使用的函数是约束泛型typeBaseType=string|number|boolean//这里表示copy的参数//只能是string,number,boolean函数的基本类型copy(arg:T):T{returnarg}类型约束通常与类型索引一起使用。例如,我们有一个专门用于获取对象值的方法。但是这个对象是不确定的,我们可以用extends和keyof来约束。functiongetValue(obj:T,key:K){returnobj[key]}constobj={a:1}consta=getValue(obj,'a')映射类型使用in关键字映射类型和traverse现有接口的key或者遍历union类型,下面的例子:typeReadonly={readonly[PinkeyofT]:T[P];};interfaceObj{a:stringb:string}typeReadOnlyObj=Readonly的以上结构,可以分为以下几步:keyofT:获取关节类型'a'|'b'通过类型索引keyof。PinkeyofT等价于pin'a'|'b',相当于执行一次forEach的逻辑,遍历'a'|'b'所以ReadOnlyObj最终的接口如下:interfaceReadOnlyObj{readonlya:string;readonlyb:string;}条件类型条件类型的语法规则与三元表达式一致,常用于某些类型不确定。上面的textendsU?X:Y的意思是如果T是U的子集,就是X类型,否则就是Y类型3.综上所述,我们可以看出,如果只掌握typeScript的一些基本类型,可能很难轻松使用它们对于typeScript,您需要了解typescript的一些高级用法。在实际场景中,组合越来越复杂。需要在实践中慢慢理解参考资料。https://www.tslang.cn/docs/handbook/advanced-types.htmlhttps://juejin.cn/post/6844904003604578312https://zhuanlan.zhihu.com/p/103846208