代码之家  ›  专栏  ›  技术社区  ›  weakish

如何在不使用重载的情况下重构具有不同arity的函数重载?

  •  0
  • weakish  · 技术社区  · 5 年前

    我有一个不同arity的typescript函数声明:

    function f(): void;
    function f(code: 0): void;
    function f(code: 1, msg: string): void;
    function f(code: 0 | 1 = 0, msg?: string): void { /* omit implementation */ }
    

    f() // ok
    f(0) // ok
    f(1, "error message") // ok
    f(0, "message") // type error
    f(1) // type error
    

    我的问题是如何在不使用函数重载的情况下重构此函数声明?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Aleksey L.    5 年前

    下面是如何使用联合类型键入参数组合:

    function f(...args: [] | [0] | [1, string]): void { /* omit implementation */ }
    

    Playground

    *带有重载的版本看起来仍然更干净。

        2
  •  0
  •   Arjan    5 年前

    这个怎么样?

    type Message = {code: 0 } | {code: 1, messageText?: string};
    
    const useMessage = (message?: Message) => {};
    
    const usedMessage_0 = useMessage();
    const usedMessage_1 = useMessage({code: 0});
    const usedMessage_2 = useMessage({code: 1});
    
    const usedMessage_3 = useMessage({code: 0, messageText: 'something'}); // type error
    const usedMessage_4 = useMessage({code: 1, messageText: 'something'});