rfcTypeInference中的类型推导部分,希望能达到预期的效果any)as{msg:string},requiredOptions:{type:(nullasany)as{msg:string},required:true}}asconst,setup(props){props.foo;//字符串props.bar;//number|undefinedprops.boo;//boolean|undefinedprops.options;//{msg:string}|undefinedprops.requiredOptions;//{msg:string}}});String->string,Number->number,Boolean->booleanintsString对应的类型是StringConstructorNumber对应的类型是NumberConstructorBoolean对应的类型是BooleanConstructor但是我们要实现的是转为小写字符串|编号|boolean所以我们写一个泛型来转换类型NormalizeType=TextendsStringConstructor?字符串:T扩展NumberConstructor?number:TextendsBooleanConstructor?boolean:T;playground预览链接定义道具类型BuiltInType=|斯特里构造函数|数字构造函数|布尔构造函数|吨;为复杂类型保留一个泛型类型以兼容rfccomplexproptypedefinitioncreateComponent函数接收到的props类型{类型?:BuiltInType;要求?:布尔值;}|BuiltInType;};最关键的一步是根据输入的propstypeReflexType={[keyinkeyofT]:T[key]extends{type:inferTYPE;来计算setup函数接收到的props类型;必填:真}?NormalizeType:T[key]extends{type:inferTYPE}?规范化类型<类型>|未定义:NormalizeType|不明确的};组合createComponent函数定义functioncreateComponent>(props:{props:T;setup(props:ReflexType):any;}){}完整代码typeBuiltInType=|字符串构造器|数字构造函数|布尔构造函数|T;typeNormalizeType=TextendsStringConstructor?字符串:T扩展NumberConstructor?number:T扩展BooleanConstr构造函数?boolean:T;typeReflexType={[keyofT]:T[key]extends{type:inferTYPE;必填:真}?NormalizeType:T[key]extends{type:inferTYPE}?规范化类型<类型>|未定义:NormalizeType|undefined};typeDefaultType={[key:string]:{type?:BuiltInType;要求?:布尔值}|BuiltInType;};functioncreateComponent>(props:{props:T;setup(props:ReflexType):any;}){}createComponent({props:{foo:{type:String,required:true},bar:{type:Number},boo:Boolean,options:(nullasany)as{msg:string},requiredOptions:{type:(nullasany)as{msg:string}},required:true}}asconst,setup(props){props.foo;props.bar;props.boo;props.options;props.requiredOptions;}});playground预览链接效果图