【问题标题】:TypeScript overloads and optional argumentsTypeScript 重载和可选参数
【发布时间】:2017-09-13 15:39:29
【问题描述】:

我有一个函数有一些重载。

function foo(x: number, y: void): void;
function foo(x: number, y: number | string): number;
function foo(x: number, y: any) {
    if (typeof y === "undefined") {
        return;
    }
    return typeof y === "string"
        ? x / parseFloat(y)
        : x / y;
}

我没有使用y 的可选参数,而是专门使用void 来指定返回值。预期的用例包括使用undefined 作为第二个参数调用它的用例。

在另一个函数中,我会这样称呼它:

function bar(x: number, y?: number | string) {
    const f = foo(x, y);
    // Some other stuff
}

这会导致以下类型错误:

Argument of type 'string | number | undefined' is not assignable to parameter of type 'string | number'.
  Type 'undefined' is not assignable to type 'string | number'.

我的理解是foostring | number | void 作为第二个参数,并且当bar 调用它时,它将传递stringnumbervoid,以及TypeScript将清楚foo 的返回值。

达到预期效果的正确方法是什么?

【问题讨论】:

    标签: typescript overloading


    【解决方案1】:

    编译器无法知道bar 中的ynumber | string 还是undefined 类型,因为两者都是可能的。如果编译器无法解决这个问题,它就无法选择正确的重载。您必须为编译器提供更多帮助:

    断言y 永远不会是undefined

    function bar(x: number, y?: number | string) {
    
        // Picks `function foo(x: number, y: number | string): number;` overload
        const f = foo(x, y!); // Use the non-null assertion operator here.
        // Some other stuff
    }
    

    或者使用type guards:

    function bar(x: number, y?: number | string) {
    
        if (y === undefined) {
            // Picks `function foo(x: number, y: void): void;` overload
            foo(x, y);
        }
        else {
            // Picks `function foo(x: number, y: number | string): number;` overload
            const a = foo(x, y);
        }
        // Some other stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 2023-03-20
      • 2013-05-23
      相关资源
      最近更新 更多