大家好,我是前端西瓜哥。今天来学习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高级类型,会通过模式匹配提取出函数的参数数组类型。如果参数无法匹配,则永远不会返回:typeParameters
