[Typescript] Deal with types of function overloads

/**
 * Utility for extracting the parameters from a function overload (for typed emits)
 * https://github.com/microsoft/TypeScript/issues/32164#issuecomment-1146737709
 */
export type OverloadParameters<T extends (...args: any[]) => any> = Parameters<
  OverloadUnion<T>
>

type OverloadProps<TOverload> = Pick<TOverload, keyof TOverload>

type OverloadUnionRecursive<
  TOverload,
  TPartialOverload = unknown,
> = TOverload extends (...args: infer TArgs) => infer TReturn
  ? TPartialOverload extends TOverload
    ? never
    :
        | OverloadUnionRecursive<
            TPartialOverload & TOverload,
            TPartialOverload &
              ((...args: TArgs) => TReturn) &
              OverloadProps<TOverload>
          >
        | ((...args: TArgs) => TReturn)
  : never

type OverloadUnion<TOverload extends (...args: any[]) => any> = Exclude<
  OverloadUnionRecursive<(() => never) & TOverload>,
  TOverload extends () => never ? never : () => never
>

https://www.typescriptlang.org/play/?ts=4.7.2#code/C4TwDgpgBA8gbhATgGwPYEMAmAFRqwDOAPACrxJpYB8UAvFNgJYDGA1qeShpgDRSsQQqAGZQyCLtQDcAWABQoSLAmVMAVQB2jVBoBKEZgFdEBRgg4rufEtnSJgjdMk6q6UQxtYbUAdw016cQpuKAgAD2AIDUwCKAAKeSgoADpUuwBzAgAuKEYNYSQxAEFETPkASjoaPILEMX1gYw1EqAB+KAB6DoZECAQNYFz8vMZIqF6jE20NKAAjECgCYHwwPPTxg2NTHSgfAAsosVt7R2dLLBakrqg99Fj0ZiMAW0NkdEjMKCdkKBEoYAOYhcIVM6Q072MEAIyUuRzsDicwKwoQiURiQPOmFh7Q0fSQsKysKSSQAPspglhNNN9JNTOYicTGTZ4ackZ8AGQYim8BmMpLMk6IzFQTlxOKpZIZbLFUoESq0GgkBpNSqctm4fDEIKSTBUXnEvVyPnEsliiVSnIkEqZeWK5WIDTlFo5XESWQKcDQNlUnQWbkoyLRWLitKynLoDQgADaAF1bV9IwEoABRMLMZCGTAQIgtb1aHQ0rZmbOw64kQEAIji8ddSAri0YYIhvSgLyWc2ge1QjCWEE+y3+leEeAG9b+AIgpe6eUiJgMDh0fGEqDqwB8qA2dx00vQlVmBnQhgI0AmRZ2S01uwOM1GuQIU9CGmYqA8s77fAjn1mlVvx4gT1iAcwF6fpBgnKBn2QN5CGgP4CEMWZjwAR0MKJgAfCtnyeMB3kYWZkAgetQXBRpemDCB0mSKAq3jOBu0wesZw3Kt0FaHIAEZaPoityh4B99hYPYoHSYt7igTBGAmQZnw0CRthmAd0HcfMNBhI1iTFGs8UQVUuR1FoqD49TtVccJA3RasqigWs6hxbSoBySyFWs7T5Cod15A6AAqeRy2gYBEBYVhAI3cD0FmVAEA2Wlpi+XoJXkeRdygABJfIkECjR1nAnDEHQJ4IFnBNPl6UiFM9WI-gjX5MT7KBhA8ZgFxmHxGCg9xj3kcC3nbSL-WI5sID4ATmCEnsvjAXK0OQBZqvCMBkBYW8s2IiCuxYCA1Pkb9UoGJBjyatYvgbLKCIbJtSOgVqAUHWDApE8Efhnfb52mPhmGq3oVyzRAusBZ650OnY4jAVACFMfDZpmDxMFQZ40Lq0ws1CYQCia1pyi2uRmEqNLZwO5rYg+mYdBmjsNgAWm+pB32s1BBnBRA8B8Oq4l6TBDGYPteKgABlVA+AneQAYJ2LbhC8nelmQw2sGPJbuogUETObl63SKIkBYQXr3kU8ph2YnyYvSa6v2Q5wIa9qRdenZxY7Q4pZl5BgDUmAJ0QVrj218b11eEqoVeOWZmqmoRjGPX5LUryOkSuRrmTSFWHQABCLrPTEKFgCKdi3DzaYiAAbxaascjoxhMHdJI4nQDjyg4yv4hrqAACY+FmHJm7rlv3QAX3c2P48wdWoAAYTuCAchoqybKIxsSMhVsj0Gfcbm7XtMDUxRoBITOimb3PMR9DRC+Lruy4r4um84+vL47tuO675uG5Lly3XkPuPLj7pkyH6Ax+PHIAARQwC0WDvGgANS69wWyoCeKMD4m9047yWEUAAzAfbkR8T7qRfufZ+V8u7sWfmfeiUhOjdA5qAj6kRb4t3vi3R++Da713IeJEBi1qGTjkB-Ae3QABy9N-K3DAoCamdQ-h9R1LEcaTx0AzjkbiT48twIeDeleQSrYIARnvF-Qc7xcjAAAOSxBAvtPCZ0jxHSUkfEgqA8YvSBuVJQZsWzgUkaoTy3QxGtnePjKifkURczAM1O81EnI0BnsNPYGi7YDhXutdenj-ihUBMOHQgxxz-T2oDZqVEAASvhtJ8FGMYhWTwwaDAIJAZgjBhAsHOvPXoRlrgjSEgVbRq8ewOCygYxYXY-ZG3QAUXIogVEqVCTJCQHw5gPFYMkhMSTraOKxtcNKtRMrrCUqonYfxcr5UKoURoC0oS-DqKVJo-wKqhO8D4KAoNwbmM2mnJQ6o7D7PxqQAMaJgzmjDAmaMcYrIRhAEmY47z9pEDzr6EgVB+4eheZie0GgSCek+WZb58RfmZHDJGWM8ZgVJiRSiyAkLD4qVILCz+W8M5LAAEI53oK8vKBUPlFxwSQ8uTCoDX25Vy1ucwH4d2IS6bSvc4XPO3pnWl+9GWIsKk0Yl2Y2VVw5RfHBrFmG8tofy9uDChWnxFW-bh4rdECLGOBCsM8NhlUuUoYmhjl7QDyOmTMtN9wfSPNAbZGhYjXSEjZJJsM6ZBxdcjUYakgA

posted @   Zhentiw  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-11-25 [Typescript] 116. Hard - Split
2022-11-25 [Typescript] 115. Hard - Drop String
2019-11-25 [ARIA] aria-describedby & aria-labelledby
2019-11-25 [Security] Always use parameterized queries
2016-11-25 [Ramda] Handle Branching Logic with Ramda's Conditional Functions
2016-11-25 [Angular2 Router] Setup page title with Router events
2015-11-25 [Redux] Store Methods: getState(), dispatch(), and subscribe()
点击右上角即可分享
微信分享提示