使用默认参数的函数重载

时间:2018-12-23 21:14:47

标签: typescript overloading

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

app.post('/delete-user', (req, res)=> {
    users.splice(users.indexOf({ username: req.body.username, password:req.body.password}, 1))

    res.send(users)
})

它带有2个参数,其中一个具有默认参数。因此,我只需要提供1个参数即可。但是,当我尝试如下使用此功能时:

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;

我收到以下错误:

const userId = getUserId(request);

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

此外,我意识到我可以禁用Expected 2 arguments, but got 1. 并且不需要重载,但是我想继续保持下去。

1 个答案:

答案 0 :(得分:0)

拆分过载:

  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;
}