首页 > 其他分享 >[Typescript] OverloadedReturnType & OverloadedParameters

[Typescript] OverloadedReturnType & OverloadedParameters

时间:2023-07-06 14:36:49浏览次数:36  
标签:... Typescript number args OverloadedParameters infer extends OverloadedReturnTy

type OverloadedReturnType<T> =
  T extends { (...args: any[]) : infer R; (...args: any[]) : infer R; (...args: any[]) : infer R ; (...args: any[]) : infer R } ? R  :
  T extends { (...args: any[]) : infer R; (...args: any[]) : infer R; (...args: any[]) : infer R } ? R  :
  T extends { (...args: any[]) : infer R; (...args: any[]) : infer R } ? R  :
  T extends (...args: any[]) => infer R ? R : any

type OverloadedParameters<T> =
  T extends { (...args: infer A1) : any; (...args: infer A2) : any; (...args: infer A3) : any ; (...args: infer A4) : any } ? A1|A2|A3|A4  :
  T extends { (...args: infer A1) : any; (...args: infer A2) : any; (...args: infer A3) : any } ? A1|A2|A3 :
  T extends { (...args: infer A1) : any; (...args: infer A2) : any } ? A1|A2  :
  T extends (...args: infer A) => any ? A : any

 

Example:

function applyChanges1(input: string): number
function applyChanges1(input: number): string
function applyChanges1(input: number | string): number | string {
  return typeof input === "number" ? input.toString() : input.length
}

function applyChanges2(input: number): string
function applyChanges2(input: string): number
function applyChanges2(input: number | string): number | string {
  return typeof input === "number" ? input.toString() : input.length
}


type OverloadedReturnType<T> = 
    T extends { (...args: any[]) : infer R; (...args: any[]) : infer R; (...args: any[]) : infer R ; (...args: any[]) : infer R } ? R  :
    T extends { (...args: any[]) : infer R; (...args: any[]) : infer R; (...args: any[]) : infer R } ? R  :
    T extends { (...args: any[]) : infer R; (...args: any[]) : infer R } ? R  :
    T extends (...args: any[]) => infer R ? R : any


type RetO1 = OverloadedReturnType<typeof applyChanges1> // string | number 
type RetO2 = OverloadedReturnType<typeof applyChanges2> // number | string

 

type OverloadedParameters<T> = 
    T extends { (...args: infer A1) : any; (...args: infer A2) : any; (...args: infer A3) : any ; (...args: infer A4) : any } ? A1|A2|A3|A4  :
    T extends { (...args: infer A1) : any; (...args: infer A2) : any; (...args: infer A3) : any } ? A1|A2|A3 :
    T extends { (...args: infer A1) : any; (...args: infer A2) : any } ? A1|A2  :
    T extends (...args: infer A) => any ? A : any


type Params01 = OverloadedParameters<typeof applyChanges1> // [string] | [number]
type Params02 = OverloadedParameters<typeof applyChanges2>  // [number] | [string]

 

标签:...,Typescript,number,args,OverloadedParameters,infer,extends,OverloadedReturnTy
From: https://www.cnblogs.com/Answer1215/p/17532033.html

相关文章

  • 关于 TypeScript 的变量声明和解构赋值(Destructuring Assignment)
    看下面这段代码:const{queryParams,fragment}=this.router.parseUrl(url);const[,path]=url.match(this.URL_SPLIT)??[,''];这段TypeScript代码虽然较短,但仍然展示了许多TypeScript的特性和语法。以下是对这段代码的分析,涵盖了相关的TypeScript特性和语法。......
  • vane 一个适用于前端打工人的全栈框架,nodejs+vue3+typescript
    vane写这个的初衷是因为每次用node写接口的时候总是需要一些写大一堆的东西,也有些人把很多接口都放在一个js文件内,看起来很是杂乱,后来用到nuxt写的时候,感觉用文件名来命名接口路径很是方便,无论是query参数还是params参数,都可以通过文件名来命名,也可以通过文件夹层级......
  • TypeScript学习笔记
    一、类型①可以使用 | 来连接多个类型(联合类型) ② 类型断言,可以用来告诉解析器变量的实际类型 ③ {}用来指定对象中可以包含哪些属性 ④函数结构的类型声明 ⑤数组的类型声明⑥元组,元组就是固定长度的数组 ⑦enum枚举⑧类别的别名 二、编......
  • typescript的必要性及使用
    1前言作为一个前端语言,Javascript从最初只是用来写页面,到如今的移动终端、后端服务、神经网络等等,它变得几乎无处不在。如此广阔的应用领域,对语言的安全性、健壮性以及可维护性都有了更高的要求。尽管ECMAScript标准在近几年有了长足的进步,但是在类型检查方面依然毫无建树。在这......
  • Typescript 内置工具类型
     Partial<T>将类型T的属性都变为可选属性,并构造一个新类型1interfaceInter{2name:string3age:number4}56typeT=Partial<Inter>//{name?:string;age?:number;}  Required<T>  将类型T的属性都变为必选属性,并构造一个新类型 和Pa......
  • typescript中 == 和 === 的区别
    在TypeScript中,==和===是用于比较两个值是否相等的操作符。 ==是相等比较操作符,它在比较值时进行隐式类型转换。它会尝试将两个操作数转换为相同类型,然后再进行比较。这种隐式类型转换可能会导致一些意想不到的结果。例如:console.log(1=="1");//trueconsole.log(t......
  • TypeScript又出新关键字了?
    TypeScript5.2将引入一个新的关键字:using。当它离开作用域时,你可以用Symbol.dispose函数来处置任何东西。{constgetResource=()=>{return{[Symbol.dispose]:()=>{console.log('Hooray!')}}}usingresource=getResource();......
  • 【TypeScript】Element 组件导入在 TypeScript 5 报错:模块 ““element-plus““ 没有
    报错现象解决方法typescript5.0版本升级,使用了compilerOptions.moduleResolution:"bundler"的模块编译选项。moduleResolution:模块解析策略,是指编译器在查找导入模块内容时所遵循的流程因此目前要解决报错,我们只需要修改tsconfig.json下的为node就行。/*Bundle......
  • TypeScript中的类
    1.类的基本语法在TypeScript中,使用class关键字来定义类。以下是一个简单的类的示例:classPerson{privatename:string;age:number;constructor(name:string,age:number){this.name=name;this.age=age;}greet(){console.log(`H......
  • C# and TypeScript – Enum Flags
    前言以前就有提过EnumFlags,但平日不常用.最近翻Angular源码,发现它很多地方用到,而且没有封装语义代码.一堆符号真的看不惯啊...于是又去复习了一遍,熟悉熟悉.顺便写一篇做记入呗.这篇C#和TypeScript会一起讲. 参考 深入理解TypeScript–枚举Enum,Fl......