У меня есть приложение 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" не работает.
3 ответа
Принятый ответ - только обходной путь, заставляющий Typescript перестать жаловаться на то, что _id не реализован в интерфейсе. Реальное исправление состоит в том, чтобы реализовать это:
interface Book {
_id : string; // <-- Add this
name: string;
reserved : boolean;
reservation : any;
}
Если эта проблема происходит на стороне сервера:
MongoDB использует ObjectID
s для своих полей _id
, поэтому это не строка, и ваш оператор '===' не будет работать.
Мое решение обычно состоит в том, чтобы проанализировать эти объекты на стороне сервера. Вы можете легко сделать это, обернув объект строкой, так как они реализуют функцию toString
:
String(yourObjectId)
Итак, в вашем случае:
this.books.find(sfid => String(sfid['_id']) === id)
Вы можете получить доступ к свойствам объекта, как элементы массива в JavaScript.
const result = this.books.find( sfid => sfid["_id"] === id);
Попробуйте, это сработает.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.