【问题标题】:Allow only class/object methods in function signature in Typescript在 Typescript 的函数签名中只允许类/对象方法
【发布时间】:2019-01-07 23:59:52
【问题描述】:

我正在尝试在 Typescript 中创建函数签名。它是一种调用函数,接收对象、方法名和要应用的参数。

使用示例:

const obj = {
  do(...args) {
    console.log(args);
  }
}

call(obj, 'do', 1, 2, 3);

我可以想象一个简单的签名,它定义了第二个参数应该是 first 的属性,但是我很难禁止所有不是方法的属性并指定可变参数是此方法的参数。

function call<T, P extends keyof T, A extends any[]>(obj: T, property: P, ...args: A): void;

现在的 Typescript 可以做到吗?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果我们使用tuples in rest parameters,提取函数的参数实际上并不是很复杂。事实上在 3.2 Typescript 使用这种方法来实现严格的callbindapply(见here

    要限制键,我们可以将T 限制为具有P 键的记录:

    const obj = {
        do(...args: string[]) {
            console.log(args);
        },
        other(o: string, n: number) {
            console.log(o);
        },
        prop: 1
    }
    
    function call<T extends Record<P, (...a: any[]) => any>, P extends keyof T>(obj: T, property: P, ...args: Parameters<T[P]>): ReturnType<T[P]> {
        return obj[property](...args);
    }
    call(obj, 'do', 1, 2, 3); // error
    call(obj, 'do', '1'); // ok
    call(obj, 'do', '1', '2'); // ok
    call(obj, 'other', '1', 2); // ok
    call(obj, 'prop'); // error
    

    【讨论】:

    • 太好了,谢谢!不知道Parameters已经实现了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多