如果函数有重载,则标准的TypeScrip Parameters<T>帮助器仅返回最新版本的参数的类型.有没有办法绕过这一限制?

type StringNumber = `${number}`;
  
function add(a: StringNumber, b: StringNumber): number
function add(a: number, b: number): number
function add<T extends (StringNumber | number)>(a: T, b: T): number
{
  return Number(a) + Number(b);
}

type AddParameters = Parameters<typeof add> // => [a: number, b: number]

const addParams: AddParameters = ['1', '3']; // Error

upd

有人建议放弃参数表,手动描述类型.但是如果重载的函数在一个单独的包中,就会导致代码重复.有没有办法修改

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

包括所有超载?

例如,我想为具有重载的函数编写包装.

import { originFn } from 'another-library';

function wrapperFn(...args: Parametrs<typeof originFn>) {
  return originFn(...args);
}

但我不想手动描述所有的重载.

推荐答案

好的.明白了.让我们try 另一种解决方案:

type StringNumber = `${number}`;

type Overloads<T> =
  T extends {
    (...args: infer A1): infer R1; (...args: infer A2): infer R2;
    (...args: infer A3): infer R3; (...args: infer A4): infer R4
  } ? [
    (...args: A1) => R1, (...args: A2) => R2,
    (...args: A3) => R3, (...args: A4) => R4
  ] : T extends {
    (...args: infer A1): infer R1; (...args: infer A2): infer R2;
    (...args: infer A3): infer R3
  } ? [
    (...args: A1) => R1, (...args: A2) => R2,
    (...args: A3) => R3
  ] : T extends {
    (...args: infer A1): infer R1; (...args: infer A2): infer R2
  } ? [
    (...args: A1) => R1, (...args: A2) => R2
  ] : T extends {
    (...args: infer A1): infer R1
  } ? [
    (...args: A1) => R1
  ] : any

type OverloadedParameters<T> =
  Overloads<T> extends infer O ?
  { [K in keyof O]: Parameters<Extract<O[K], (...args: any) => any>> }[keyof O] : never
  
function add(a: StringNumber, b: StringNumber): number
function add(a: number, b: number): number
function add<T extends (StringNumber | number)>(a: T, b: T): number
{
  return Number(a) + Number(b);
}

type AddParameters = OverloadedParameters<typeof add>;

const addParams: AddParameters = ['1', '3']; // no error

playground

GitHub

Typescript相关问答推荐

在TypScript手册中可以视为接口类型是什么意思?

类型脚本强制泛型类型安全

如何修复正在处理类型但与函数一起使用时不处理的类型脚本类型

使用泛型keyof索引类型以在if-condition内类型推断

适当限制泛型函数中的记录

在Reaction-Native-ReAnimated中不存在Animated.Value

寻址对象中路径的泛型类型

找不到财产的标准方式?

@TANSTACK/REACT-QUERY中发生Mutations 后的数据刷新问题

如何在省略一个参数的情况下从函数类型中提取参数类型?

在构建Angular 应用程序时,有没有办法通过CLI传递参数?

KeyOf关键字在特定示例中是如何工作的

TS不能自己推断函数返回类型

打字:注解`是字符串`而不是`布尔`?

通过函数传递确切的类型,但验证额外的字段

T的typeof键的Typescript定义

Typescript:是否将联合类型传递给重载函数?

Karma Angular Unit测试如何创建未解析的promise并在单个测试中解决它,以判断当时的代码是否只在解决后运行

为什么 typescript 在对象合并期间无法判断无效键?

req.files = 未定义(Multer、Express、Typescript)