我不知道如何获取在接口中声明的函数的参数类型。我需要对它们进行正确的类型检查。可能需要使用: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;
答案 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 constrained是Functions
的通用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]
的每个函数元素。如果这些假设是错误的,希望它们仍然可以引导您朝着有用的方向发展。
希望有所帮助;祝你好运!