从泛型函数的声明中获取参数-TypeScript 3.3

时间:2019-03-22 17:05:41

标签: typescript generics parameters keyof

我不知道如何获取在接口中声明的函数的参数类型。我需要对它们进行正确的类型检查。可能需要使用:TypeScript版本的Parameters类:3.3:https://github.com/Microsoft/TypeScript/blob/v3.3.1/lib/lib.es5.d.ts#L1471-L1474,但我不知道如何使用它。

A = [3, 5, 9, 15, 27, 33, 35, 41, 57, 65]
B = [1, 16, 18, 42, 44, 46, 48, 50, 52, 54]

AUB = [1, 3, 5, 9, 15, 16, 18, 27, 33, 35, 41, 42, 44, 46, 48, 50, 52, 54, 57, 65]
and if k = 6
then AUB[6-1] = 16;
if k = 8
then AUB[8-1] = 27;

1 个答案:

答案 0 :(得分:0)

在这里,我将为您解决问题,并指出我必须清理很多东西并猜测您在做什么:

interface MyFunctions {
  FIRST_FUNCTION: () => void;
  SECOND_FUNCTION: (x: string, y: number) => void; // FIXED
}

// constrain Functions to a type holding only function properties
class Params<Functions extends Record<keyof Functions, (...args: any[]) => any>> {

  private functions: Map<keyof Functions, Set<Functions[keyof Functions]>> = new Map();

  // use Parameters as requested
  public boom<K extends keyof Functions>(func: K, ...args: Parameters<Functions[K]>) {
    // assert that it returns a set of the right kind of function
    const funcSet = (this.functions.get(func) || new Set()) as Set<Functions[K]>;

    // okay, and remember to use spread
    funcSet.forEach(f => f(...args));
  }
}

new Params<{a: string}>(); // error, string is not a function

new Params<MyFunctions>().boom("FIRST_FUNCTION"); // okay
new Params<MyFunctions>().boom("SECOND_FUNCTION", "a", 1); // okay

与您的问题有关的部分:

  • I constrainedFunctions的通用Record<keyof Functions, (...args: any[]) => any>类型,因此编译器知道Functions的所有属性都必须是函数。这样可以防止您致电new Params<{a: string}>()

  • 我已将args的休息参数键入为Parameters<Functions[K]>,其中Functions[K] looks up的属性Functions的键为{{1} }。由于受通用约束,编译器知道K必须是函数类型,因此很高兴允许您将其传递给Functions[K]并返回参数的元组。

我重新编写了Parameters<>的实现,对我来说更有意义。我需要执行type assertion才能使编译器确信boom()产生的实际上是一组this.functions.get(func),而不是一组较宽的Functions[typeof func]。然后,在参数上使用spread syntax来调用获取的Functions[keyof Functions]的每个函数元素。如果这些假设是错误的,希望它们仍然可以引导您朝着有用的方向发展。

希望有所帮助;祝你好运!