Deno - Ошибка TS2339 [ERROR]: Property 'name' does not exist on type 'UserSchema | null'

280
16 июня 2022, 22:10

Есть две функции javascript/typescript(Deno). Первая получает инфо по пользователю по id, а вторая удаляет пользователя по id. Во вторую функцию я добавил две строчки, для реализации определенной бизнес логики. Строчки скопировал из рабочей функции getUser. Дебагер ругается на вторую строку скопированного текста. Не могу понять, что не так с проблемной строкой. Текст ошибки приведен ниже.

const user: (UserSchema | null) = await User.findOne({ _id: ObjectId(id) });
const { name, email, role, isDisabled, createdAt, updatedAt } = user;

Рабочая функция

  /**
   * Get single user service
   * @param id
   * @returns Promise<UserSchema | Error> Returns user document
   */
  public static async getUser(id: string): Promise<UserStructure | Error> {
    const user: (UserSchema | null) = await User.findOne({ _id: ObjectId(id) });
    if (!user) {
      log.error("User not found");
      return throwError({
        status: Status.NotFound,
        name: "NotFound",
        path: "user",
        param: "user",
        message: `user not found`,
        type: "NotFound",
      });
    }
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
    return { id, name, email, role, isDisabled, createdAt, updatedAt };
  }

Функция на которую дебагер выдает сообщение об ошибке.

  /**
   * Remove user service
   * @param id
   * @returns Promise<number | Error Returns deleted count
   */
  public static async removeUser(id: string): Promise<number | Error> {
    const user: (UserSchema | null) = await User.findOne({ _id: ObjectId(id) });
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
    
    const deleteCount: number = await User.deleteOne({ _id: ObjectId(id) });
    if (deleteCount) {
      const updatedAt = new Date();
//      const user_history: ObjectId = await UserHistory.insertOne(
//        {_id: _id, name: name, email: email, role: role, isDisabled: isDisabled, createdAt: createdAt, updatedAt: updatedAt, doc_version: doc_version + 1},
//      );
    }
    else {
      return throwError({
        status: Status.BadRequest,
        name: "BadRequest",
        path: "user",
        param: "user",
        message: `Could not delete user`,
        type: "BadRequest",
      });
    }
    return deleteCount;
  }
}

Текст ошибки

C:\Users\yuriy\.deno\bin\deno.exe run --inspect-brk=127.0.0.1:9229 --allow-all --unstable .\app.ts
Debugger listening on ws://127.0.0.1:9229/ws/95e7c5ac-803a-409b-a0c9-028fa3f965e3
Check file:///C:/Users/yuriy/source/repos/deno_rest/app.ts
error: TS2339 [ERROR]: Property 'name' does not exist on type 'UserSchema | null'.
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
            ~~~~
    at file:///C:/Users/yuriy/source/repos/deno_rest/services/user.service.ts:124:13
TS2339 [ERROR]: Property 'email' does not exist on type 'UserSchema | null'.
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
                  ~~~~~
    at file:///C:/Users/yuriy/source/repos/deno_rest/services/user.service.ts:124:19
TS2339 [ERROR]: Property 'role' does not exist on type 'UserSchema | null'.
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
                         ~~~~
    at file:///C:/Users/yuriy/source/repos/deno_rest/services/user.service.ts:124:26
TS2339 [ERROR]: Property 'isDisabled' does not exist on type 'UserSchema | null'.
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
                               ~~~~~~~~~~
    at file:///C:/Users/yuriy/source/repos/deno_rest/services/user.service.ts:124:32
TS2339 [ERROR]: Property 'createdAt' does not exist on type 'UserSchema | null'.
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
                                           ~~~~~~~~~
    at file:///C:/Users/yuriy/source/repos/deno_rest/services/user.service.ts:124:44
TS2339 [ERROR]: Property 'updatedAt' does not exist on type 'UserSchema | null'.
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
                                                      ~~~~~~~~~
    at file:///C:/Users/yuriy/source/repos/deno_rest/services/user.service.ts:124:55
Found 6 errors.
Answer 1

Требуется добавить проверку if (!user) перед присвоением.

  /**
   * Remove user service
   * @param id
   * @returns Promise<number | Error Returns deleted count
   */
  public static async removeUser(id: string): Promise<number | Error> {
    const user: (UserSchema | null) = await User.findOne({ _id: ObjectId(id) });
    if (!user) {
      log.error("User not found");
      return throwError({
        status: Status.NotFound,
        name: "NotFound",
        path: "user",
        param: "user",
        message: `user not found`,
        type: "NotFound",
      });
    }
    const { name, email, role, isDisabled, createdAt, updatedAt } = user;
    
    const deleteCount: number = await User.deleteOne({ _id: ObjectId(id) });
    if (deleteCount) {
      const updatedAt = new Date();
//      const user_history: ObjectId = await UserHistory.insertOne(
//        {_id: _id, name: name, email: email, role: role, isDisabled: isDisabled, createdAt: createdAt, updatedAt: updatedAt, doc_version: doc_version + 1},
//      );
    }
    else {
      return throwError({
        status: Status.BadRequest,
        name: "BadRequest",
        path: "user",
        param: "user",
        message: `Could not delete user`,
        type: "BadRequest",
      });
    }
    return deleteCount;
  }
}
READ ALSO
manifest.json возвращает noscript

manifest.json возвращает noscript

У меня есть сайт KinoFinderПри первом запуске (или ctrl + F5) В консоли такая ошибка:

172
Сделать цветную область внутри чернобелого background-image

Сделать цветную область внутри чернобелого background-image

Есть div с шириной 100% и высотой 100vh и заданной ему фоновой картинкой в качестве background; также заданы background-size: cover и filter: grayscale(100%)Нужно расположить...

130
Передача ID через ajax

Передача ID через ajax

Всем приветесть кнопка "Лайк" при клике которой счетчик должен увеличиваться на 1

173