【问题标题】:Can I use Parameters<T> to lazily type my ...args param? [duplicate]我可以使用 Parameters<T> 懒惰地输入我的 ...args 参数吗? [复制]
【发布时间】:2021-02-04 07:02:43
【问题描述】:

我想使用另一个函数为接口运行方法(这样我可以在执行过程中抛出一些上下文信息)。我希望我可以让 Typescript 使用 Parameters 实用程序类型为我完成繁重的工作......但我似乎无法让它工作。

这是简化的情况:

interface Store {
    read(key: string): string
    write(key: string, data: string): boolean
}

function run<T extends keyof Store>(store: Store, job: T, ...args: Parameters<Store[T]>) {
    return store[job](...args);
}

还有错误:

(parameter) args: Parameters<Store[T]> 
Expected 2 arguments, but got 0 or more.
temp.ts(3, 11): An argument for 'key' was not provided.

有谁知道我可以如何做到这一点,而不必手动编写run 的所有函数签名?我对打字稿有点陌生,一定缺少一些东西。


顺便说一句,vscode 可以正确判断这些用法的错误之处:vscode doing magic?

【问题讨论】:

    标签: typescript parameters


    【解决方案1】:

    TypeScript 以一种无用的方式解析查找。如果您检查store[job] 的类型,您会得到:

    const func = store[job];
    
    // Hover func here => const func: (key: string, data: string) => string | boolean;
    return func(...args);
    

    所以它只是合并了所有的函数签名,这会打乱调用。

    你知道这应该是正确的,我建议告诉 TS 闭嘴,check for an issue in the TypeScript repository,如果不合适,可能会提交一个新的。也许这是一个可以修复的错误,也许是一个会保留的限制。

    function run<T extends keyof Store>(store: Store, job: T, ...args: Parameters<Store[T]>)
        : ReturnType<Store[T]> {
        // @ts-expect-error
        return func(...args);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多