代码之家  ›  专栏  ›  技术社区  ›  Estus Flask

休息/扩展参数类型

  •  2
  • Estus Flask  · 技术社区  · 7 年前

    对于这段代码:

    type Callback = (err: Error | null, result: String) => void;
    
    let apiThatAcceptsCallback = (cb: Callback) => { /*...*/ }; 
    
    function callback(err: Error | null, result: String) {}
    
    
    apiThatAcceptsCallback((...args) => {
        console.log(args);
        callback(...args);
    });
    

    callback(...args) 导致错误:

    需要2个参数,但得到0个或更多。

    如何以类型安全的方式解决此问题?回到 callback.apply(null, args) 在ES6中感觉不对。

    注意,不能有2个参数,但可以有10个参数,所以枚举它们不是一个好的选择。

    1 回复  |  直到 7 年前
        1
  •  3
  •   jcalz    7 年前

    现在,你能得到的只是一些不安全的工作区。从typescript 3.0开始,它应该会出现 quite soon (July 2018) ,您将能够使用 tuples in rest/spread positions 是的。如果你现在想试试,你可以用 typescript@next 是的。

    一旦着陆,你将能够:

    // turn a function's parameters into a tuple, might be in standard library
    type Parameters<T extends Function> = T extends (...args: infer U) => any ? U : any[];
    
    apiThatAcceptsCallback((...args: Parameters<Callback>) => {
      console.log(args);
      callback(...args); // no error
    });
    

    在该代码中,您需要显式键入 ...args 作为 Parameters<Callback> 因为它似乎不是从上下文中推断出来的(我想知道这是否应该是一个特性请求),但是您不必枚举 参数<回调> 正是您要使用的类型。

    希望(最终)能有所帮助。祝你好运。

    推荐文章