当前位置: 首页 > 科技观察

TypeScript中的Any、Unknown、Never、Void

时间:2023-03-13 00:06:37 科技观察

大家好,我是前端西瓜哥。今天来学习TS中的几个特殊类型:any、never、never、void。anyany表示任何类型。是任意类型的父类,任意类型的值可以赋给任意类型://编译时不会报错letanything:any='前台西瓜哥';letflag:boolean=true;anything=标志;任何东西={num:2};它可以表示任何类型并使用它们的语法,就像编写没有类型的原生JS一样。//编译不会报错consta:any=6;a();a.key1=true;any相当于放弃了类型系统,这会让代码不可预测,难以维护,需要程序员去维护小心。粗心会导致运行时错误,因此请谨慎使用。但是在引入一些不提供类型的第三方纯JS库的时候,还是要标记为any,这实在是做不到。除非你自己写第三方库的类型声明,否则太不现实,因为你不熟悉第三方库的API,可能要实现非常复杂的类型推导。any的存在是为了与无类型的JS兼容。由于TS是JS的超集,所以需要使用any打开后门。unknownunknown可以被认为是类型安全的any。与any一样,unknown也是any类型的子类型,所有类型都可以传递给unknown,包括any。//编译不会报错leta:unknown='前端西瓜哥';letb:any;a=b;a={num:2};说unknown更安全,因为unknown不能执行任何操作。如果要使用它,则需要使用as进行显式类型断言。declareconstuser:known;//报错,unknown不能使用user.toLowerCase();//开发者认为user是一个字符串//useasfortypeinferencebeforeitcanbeused(userasstring).toLowerCase();或者我们可以使用TypeNarrowing;声明const用户:未知;if(typeofuser==='string'){user.toLowerCase();}对于一些可疑的没有类型的变量,如果不想被不小心使用的话,此时可以使用unknown。总结就是:未知看得见,用不着。如果要使用它,请先键入断言。nevernever代表一个不可观察的类型,分配给它的变量不能做任何事情。一些从不使用的场景。(1)无法走到返回值的函数,比如肯定会抛出错误或者死循环://这里的never表示函数不能执行,直到函数返回其返回值functionfoo():never{thrownewError('somethingwrong!')}(2)TS会在判断条件下缩小类型。当类型收缩为无类型时,类型变为never:functiongetData(id:number|string){if(typeofid==='string'){//idtype变为string}elseif(typeofid==='number'){//idtype变为number}else{//idtype变为never}}或者做一个不可能为真的缩小类型:if(typeofid==='number'&&typeofid==='string'){//id不能既是number又是string//所以会变成never}或者找不到交集的交叉类型://ImpossibleType会变成nevertypeImpossibleType=string&number;(3)类型编程中,在做模式匹配时,如果匹配失败,还是要返回一个类型。要指示失败,返回一个never以指示不能使用返回的类型。比如TS内置的Parameters高级类型,会通过模式匹配提取出函数的参数数组类型。如果参数无法匹配,则永远不会返回:typeParametersany>=Textends(...args:inferP)=>any?P:never(4)类型在编程中,一些类型被丢弃。never在联合类型和重新映射的键中被丢弃。例如TS内置的Exclude高级类型会丢弃联合类型T中不属于U的key。类型Exclude=TextendsU?从不:TtypeT=Exclude<"a"|“乙”|"c","a">;//T的类型是"b"|"c"//其实应该是never|“乙”|“c”,但never是无意义的并被删除。voidvoid用于表示函数没有返回值。functionsayHi():void{console.log('Hi!');}当然实际的JS运行时,还是会返回一个默认的undefined。但TS将返回值设置为void,语义更好。总结any是任何类型,具有所有类型的行为,可以执行,可以访问属性,并且脱离类型系统。unknown是类型安全性更高的any。您也可以为其分配任何类型,但不能执行任何操作。您必须使用类型断言来显示执行操作的类型。never是不可观察的类型,比如函数的返回值不会被执行,合并后的结果中不存在的交集类型。在类型编程中非常活跃,经常用来丢弃一些子类型。void比较简单,只是表示函数没有返回值,没有其他场景。