【问题标题】:Function overloading with default arguments带默认参数的函数重载
【发布时间】:2018-12-23 21:14:47
【问题描述】:

我有一个看起来像这样的重载函数:

function getUserId(request: ContextParameters, requireAuth: true): string;
function getUserId(request: ContextParameters, requireAuth: false): string | undefined;
function getUserId(request: ContextParameters, requireAuth = true): string | undefined {
  const authHeader = request.request.headers.authorization;
  if (authHeader) {
    const token = authHeader.replace('Bearer ', '');
    const payload = jwt.verify(token, 'THISISTHENODESECRET') as TokenPayload;
    return payload.userId;
  }

  if (requireAuth)
    throw new Error('Authentication required');
}

export default getUserId;

它有 2 个参数,其中一个有一个默认参数。所以我只需要提供 1 个参数。但是,当我尝试按如下方式使用此功能时:

const userId = getUserId(request);

我收到以下错误:

Expected 2 arguments, but got 1.

这是预期的吗?还是一个错误?我将如何解决这个问题?

另外,我意识到我可以禁用 strictNullChecks 并且不需要重载,但我想继续使用它。

【问题讨论】:

    标签: typescript overloading


    【解决方案1】:

    拆分你的重载:

    1. 根本不应该接受requireAuth
    2. 应该分配默认值。

    考虑这个例子:

    function foo(flag: true): true;
    function foo(flag: false): false;
    function foo(): false
    function foo(flag = false): boolean {
        if (flag) {
            return true;
        }
    
        return false;
    }
    

    用法:

    foo(true)  // true
    foo(false) // false
    foo()      // false
    

    生成的 JavaScript 正是您所期望的:

    "use strict";
    function foo(flag = false) {
        if (flag) {
            return true;
        }
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多