我怎样在typescript中得到一个方法参数的类型?

0ve6wy6x  于 2023-01-14  发布在  TypeScript
关注(0)|答案(2)|浏览(187)

我想像从函数中获取参数一样获取方法的参数类型,但这是行不通的:

function func(a: number, b: string): string {
  return b;
}

type ftype = Parameters<typeof func>;

class Klasse {
  method(a: number, b: string): string {
    return b;
  }
}

// this does not work
type mtype = Parameters<typeof klasse.method>;

不,我不想把方法转换成静态方法,这只是一个简化的例子。
---修改---
该解决方案有效,但不适用于重载:

class Klasse {
  method(a: string, b: number): void;
  method(a: number, b: string): void;
  method(a: number | string, b: number | string): string {
    return 'x';
  }
}

// this does not work
// type mtype = Parameters<typeof klasse.method>;
type mtype = Parameters<Klasse["method"]>;

const a: mtype = [0, ''];
const b: mtype = ['', 9]; // error
7gs2gvoe

7gs2gvoe1#

正如您所观察到的,可以使用类型实用程序Parameters<Type>派生函数参数的元组。
因为函数在程序中是一个(不是类型),所以派生函数的类型需要使用typeof operator,如下所示:
TSPlayground

function func(a: number, b: string): string {
  return b;
}

type F1 = Parameters<func>; /* Error
                     ~~~~
'func' refers to a value, but is being used as a type here. Did you mean 'typeof func'?(2749) */

type F2 = Parameters<typeof func>; // ok
   //^? type F2 = [a: number, b: string]

在JavaScript中,classes只是我们可以使用syntax sugar编写的特殊函数,派生类的类型与派生其他函数的方式相同:typeof Klasse.
为了引用类的示例的类型,您可以简单地使用类名:当类在代码范围内时,TypeScript会自动在范围内创建一个类型名称来表示此:Klasse.
TypeScript还提供了另一个用于执行此操作的实用程序类型:InstanceType<Type>
下面是一些代码来演示和并列我上面描述的内容:
TSPlayground

class Klasse {
  method(a: number, b: string): string {
    return b;
  }
}

type KlasseKeys = keyof typeof Klasse;
   //^? type KlasseKeys = "prototype"

type KlasseInstanceKeys = keyof Klasse;
   //^? type KlasseInstanceKeys = "method"

type KlasseInstanceKeys2 = keyof InstanceType<typeof Klasse>;
   //^? type KlasseInstanceKeys2 = "method"

type MethodParams = Parameters<Klasse['method']>;
   //^? type MethodParams = [a: number, b: string]

type MethodParams2 = Parameters<InstanceType<typeof Klasse>['method']>;
   //^? type MethodParams2 = [a: number, b: string]
x4shl7ld

x4shl7ld2#

类型KlasseKlasse示例的类型。

type mtype = Parameters<Klasse["method"]>;

相关问题