У меня есть приложение Angular с MongoDB, откуда я беру данные в массив именных книг, который имеет одну запись и выглядит так:

{_id: "5b768f4519d48c34e466411f", name: "test", reservation: null, reserved: false, __v: 0}

С интерфейсом TypeScript

interface Books { 
    id?: Number; 
    name: String; 
    reservation: Number; 
    reserved: Boolean; 
}

Я пытаюсь найти зарезервированное значение из этой записи массива на основе "_id". Другая переменная «id» без подчеркивания, которая стоит после ===, вставляется при нажатии кнопки, которая работает под кодом:

findBook(id) {
      const result = this.books.find( sfid => sfid._id === id);
      console.log('reservation for this book is: ' + result.reserved);
        // todo: do something if book is reserved
    }

Теперь это работает очень хорошо, и я получаю результат, но в Angular отладчике я получаю ошибку ниже:

ОШИБКА в файле src / app / components / index / index.component.ts (24,56): ошибка TS2339: свойство «_id» не существует для типа «Книги».

Тем не менее, как я должен правильно искать, используя имя _id значение? Замена "sfid._id" на "sfid.id" не работает.

0
mantisghost 21 Авг 2018 в 11:31

3 ответа

Лучший ответ

Принятый ответ - только обходной путь, заставляющий Typescript перестать жаловаться на то, что _id не реализован в интерфейсе. Реальное исправление состоит в том, чтобы реализовать это:

interface Book {
   _id : string; // <-- Add this
   name: string;
   reserved : boolean;
   reservation : any;
}
2
Jeremy Thille 21 Авг 2018 в 09:35

Если эта проблема происходит на стороне сервера:

MongoDB использует ObjectID s для своих полей _id, поэтому это не строка, и ваш оператор '===' не будет работать.

Мое решение обычно состоит в том, чтобы проанализировать эти объекты на стороне сервера. Вы можете легко сделать это, обернув объект строкой, так как они реализуют функцию toString:

String(yourObjectId)

Итак, в вашем случае:

this.books.find(sfid => String(sfid['_id']) === id)
0
Moti Shriki 21 Авг 2018 в 08:58

Вы можете получить доступ к свойствам объекта, как элементы массива в JavaScript.

const result = this.books.find( sfid => sfid["_id"] === id);

Попробуйте, это сработает.

1
A. Todkar 21 Авг 2018 в 08:39
51944655