大家好,我是小鱼小鱼,致力于分享有趣实用的技术文章。内容分为翻译内容和原创内容。如有任何疑问,欢迎评论或私信。希望和大家一起进步。分享不易,希望得到大家的支持和关注。extendstypescript2.8引入了条件类型关键字:extends,它看起来像这样:TextendsU?X:Y是不是有点像三元运算符:条件?result(1):result(2),用大白话可以表达为:如果T中包含的类型是U中包含的类型的‘子集’,则取结果X,否则取结果Y。给一个再来几个ts预定义条件类型的例子加深理解:typeNonNullable=Textendsnull|不明确的?never:T;//如果泛型参数T为null或undefined,则取never,否则直接返回T。让demo1:NonNullable;//=>numberletdemo2:NonNullable;//=>stringletdemo3:NonNullable;//=>从不分配extendsTextendsU?X:Y其实就是上面的T是联合类型的时候,会被拆分,有点类似数学中的分解因子:(a+b)*c=>ac+bc官网的另一个例子:输入Diff=TextendsU?从不:T;//找出T类型的区别Filter=TextendsU?T:从不;//找到交集类型T30=Diff<"a"|“乙”|“c”|“d”,“a”|“c”|"f">;//=>"b"|"d"//<"a"|“乙”|“c”|“d”,“a”|“c”|"f">//等同于//<'a',"a"|“c”|"f">|//<'b',"a"|“c”|"f">|//<'c',"a"|“c”|"f">|//<'d',"a"|“c”|"f">typeT31=过滤器<"a"|“乙”|“c”|“d”,“a”|“c”|"f">;//=>"一个"|"c"//<"a"|“乙”|“c”|“d”,“a”|“c”|"f">同上letdemo1:Diff;//=>number让我们再看看推断。Infer还支持extends语句中的infer关键字,它可以推断类型变量并高效地模式匹配类型。但是,这种类型变量只能在真正的分支中使用。//内置ReturnTypetypeReturnType=Textends(...args:any[])=>inferR?R:任何;我是……其实理解之后就很简单了。这里直接说说我的理解。应该是相当简单易懂的:inferX相当于声明了一个变量,后面可以用到。是不是有点像for循环?声明声明?for(leti=0,len=arr.length;iinferR`subset`,则返回infer得到的函数返回值,否则返回boolean类型Func=Textends()=>推断R?R:布尔值;让func1:Func;//=>booleanletfunc2:Func<''>;//=>booleanletfunc3:Func<()=>Promise>;//=>PromiseExample2//同上,但是当a和b是不同类型时,返回不同类型的联合类型typeObj=Textends{a:inferVType,b:inferVType}?VType:number;letobj1:Obj;//=>numberletobj2:Obj;//=>numberletobj3:Obj<{a:number,b:number}>;//=>numberletobj4:Obj<{a:number,b:()=>void}>;//=>数字|()=>voidExample3(UnwrapRefinVue3)//如果泛型变量T是ComputedRef的'子集',则使用UnwrapRefSimple处理ComputedRef泛型参数V//否则进一步判断是否是Ref的'子集',进一步UnwrapRefSimpleexporttypeUnwrapRef=TextendsComputedRef?UnwrapRefSimple:TextendsRef?UnwrapRefSimple:UnwrapRefSimple//我是分界线//如果T是Function|CollectionTypes|BaseTypes|Ref之一的‘子集’,直接返回//否则判断是否是数组‘子集’,如果不是,就把它当作一个对象,调用UnwrappedObjecttypeUnwrapRefSimple=TextendsFunction|集合类型|基本类型|参考?T:T扩展Array?T:T扩展对象?UnwrappedObject:T//我是分割线//调用UnwrapRef产生递归效果,解决ts类型递归typeUnwrappedObject={[PinkeyofT]:UnwrapRef}&SymbolExtract//我是分割线//GenericRefexport接口Ref{[Symbol()]:truevalue:T}//我是分割线导出接口ComputedRefextendsWritableComputedRef{readonlyvalue:T}//我是分割线导出接口WritableComputedRefextendsRef{readonlyeffect:ReactiveEffect}建议自己看。综上所述,ts提供的extends和infer大大增加了类型判断的灵活性和复用性。虽然可以用也可以不用,但是高级特性的熟练使用会大大提高ts推理的效率和代码类型的可读性。如果您有任何问题,请指出。劳动节快乐!