Перегрузка функции аргументами по умолчанию - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть перегруженная функция, которая выглядит следующим образом:

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, и у меня нет необходимости в перегрузке, но я бы хотел оставить это включенным.

1 Ответ

0 голосов
/ 24 декабря 2018

Разделите ваши перегрузки:

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