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

什么?函数类型重载也可以动态生成?

时间:2023-03-14 15:14:44 科技观察

重载是指一个函数可以有不同的参数和返回值,也就是有不同的函数签名。ts支持函数重载,可以为同一个函数定义多个不同的类型:重载的写法有3种(估计大部分人只会一种):declarefunctionfunc(name:string):string;declarefunctionfunc(名称:号码):号码;这个大家都常用,声明两个同名函数就可以达到重载的目的:函数可以用接口的形式声明,同样,函数重载也可以用接口的形式声明:函数类型可以是交集类型,也就是可以使用多种类型,这其实就是函数重载的意思:虽然重载是一个非常有用的特性,但是当重载太多的时候,有时候写起来还是挺麻烦的。比如ts提供的lib.dom.ts中有这么一个类型定义:因为每个参数对应不同的返回值,所以重载了这么多。这么写太麻烦了,能不能通过类型编程动态生成呢?考虑重载这三种方式,declare和interface不好,但是&还可以,我能不能传入一个联合类型,然后返回交叉类型呢?例如,可以将所有提示都显示出来。看看它是如何实现的:joint-to-crossover函数的参数具有反转的性质,即类型减少。例如,可以同时将参数传递给A、B、C。如果是这样,如何定义参数类型?必须是A、B、C的交集,也就是你的A&B&C的交集类型,这样你才能接收到A、B、C的参数。这个属性可以用来实现联合转移。举个例子:肯定是可以提示的,我们看看是怎么实现的:jointtocrossfunction的参数有倒置的性质,也就是类型缩减。例如,如果参数可以同时传递给A、B、C,那么参数类型如何定义?必须是A、B、C的交集,也就是你的A&B&C的交集类型,这样你才能接收到A、B、C的参数。这个属性可以用来实现联合转移。类型UnionToIntersection=(UextendsU?(x:U)=>unknown:never)extends(x:inferR)=>unknown?R:never测试一下:这里的类型参数U是传入的联合类型,加一个UextendsU是触发分布式条件类型的特性。什么是分布式条件类型?当类型参数为联合类型时,在条件类型左侧直接引用类型参数时,TypeScript会分别传入每个元素进行类型计算,最后组合成联合类型。这种语法称为分布式条件类型。比如这样一个联合类型:typeUnion='a'|'b'|'C';如果我们想把其??中的a大写,我们可以这样写:typeUppercaseA=Itemextends'a'?大写<项目>:项目;回到联合传递的高级类型:增加一个UextendsU或Uextendsany可以触发分布式条件类型的特性,让联合类型分到每个类型分别传入计算,最后将结果Combined成联合类型。然后放到函数参数的位置,构造一个函数类型,通过模式匹配提取出参数的类型,返回给infer声明的局部变量R。其结果是交集类型。原因上面已经说了,函数参数具有逆变的性质,传入联合类型会返回交集类型。实现联合转换后,函数重载可以这样写:比如三个重载的返回值分别是Aaa、Bbb、Ccc:我们要根据这个生成一个重载的类型定义,联合传入返回重载函数的类型:你可以这样写:typeUnionToOverloadFunction=UnionToIntersectionReturnValueMap[T]:从不>;类型参数T是ReturnValueMap中的key,约束是ReturnValueMap的key。通过Textendsany触发分布式条件类型中union类型的分布特性,让'aaa''bbb''ccc'传入计算,返回构造函数类型的union。我们先测试一下这部分:可以看到返回的类型是构造函数类型的联合类型。那就直接用上面的UnionToIntersection切换crossover:这样就实现了重载函数的动态生成:对比一下原来的写法:是不是清爽多了!而且你也可以写一些动态逻辑。总结一下,ts函数重载的写法有三种:declarefunction,interface,crosstype&。重载很多的时候,直接列出来比较麻烦。这时候可以使用类型编程来动态生成函数重载。我们实现了并交交集,利用了函数参数的逆变性,即当参数可能是多种类型时,返回它们的交集类型。然后利用分布式条件类型的特性,在传入联合类型时,会单独传入该类型进行计算,最后将结果合并到联合类型中。利用这个,实现了传入和返回给构造函数的函数的联合类型,然后通过联合联合交叉实现函数重载的动态生成。当你写的重载太多时,不妨尝试使用类型编程来动态生成它们!