Typescript отличается интерфейсом в зависимости от аргумента функции

#javascript #typescript #mongoose

#javascript #typescript #мангуст

Вопрос:

У меня следующий сценарий, у меня есть 2 интерфейса:

 export interface UserInterface extends Document {
    email: string,
    role: string,
    created: Date,
    disabled: Boolean,
    author: AuthorInterface
}

export interface UserModelInterface extends UserInterface {
    password: string
}
  

и у меня есть один метод:

 public findUserById(_id: mongoose.Types.ObjectId | string, sensitive: Boolean = false): Promise<UserInterface | null> {
    if (sensitive) return User.findOne({ _id }).exec()
    return User.findOne({ _id }, { password: 0 }).exec()
}
  

Я хочу следующее:

Это метод, который получает пользователя по идентификатору. sensitive по умолчанию на false witch указывает, что пароль исключен, поэтому я использую UserInterface

Проблема, с которой я столкнулся сейчас, заключается в том, что если кто-то установит значение sensitive on true , мне нужно будет использовать UserModelInterface , а не UserInterface потому, что пароль исключен в UserInterface

Возможно ли это?

Комментарии:

1. Вот для чего хороша перегрузка.

2. @Bergi не могли бы вы это объяснить? или связать мне некоторые ресурсы?

3. первый удар: typescriptlang.org/docs/handbook/functions.html#overloads

Ответ №1:

Спасибо @Bergi за то, что показал мне направление. Решение заключается в использовании перегрузок:

 public findUserById(_id: mongoose.Types.ObjectId | string, sensitive?: false): Promise<UserInterface | null>
public findUserById(_id: mongoose.Types.ObjectId | string, sensitive?: true): Promise<UserModelInterface | null>

public findUserById(_id: mongoose.Types.ObjectId | string, sensitive: Boolean = false): Promise<UserModelInterface | UserInterface | null> {
    if (sensitive) return User.findOne({ _id }).exec()
    return User.findOne({ _id }, { password: 0 }).exec()
}