Коллекция Meteor Mongo не использует интерфейс typescript

#mongodb #typescript #meteor #collections #interface

#mongodb #typescript #метеор #Коллекции #интерфейс

Вопрос:

Я хочу описать Mongo.Схема сбора через интерфейс typescript для строгой проверки типа при выборке, forEach и т. Д.

 interface IChat {
  _id: string;
  name?: string
};

const Chats = new Mongo.Collection<IChat>('chat');

// (method) Mongo.Cursor<IChat>.forEach(callback: <T>(doc: T, index: number, cursor: Mongo.Cursor<T>) => void, thisArg?: any): void
Chats.find().forEach(c => {
  console.log(c._id); // Property '_id' does not exist on type 'T'.
  // Why "type T" if it should be the type IChat???
});
 

Но столкнулся со следующей ошибкой: Property '_id' does not exist on type 'T'.

Что я делаю не так?

Ссылка на typescript playground

Ошибка

Определение Collection.find().forEach()

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

1. ну, вы, кажется, определяете это самостоятельно. Поскольку вы его определяете, обратный forEach вызов получит первый аргумент типа T, который, как вы утверждаете, не имеет _id поля — хотя на самом деле, конечно, это так, поскольку это документ в коллекции mongo. Ваше определение типа для Collection.find().forEach() неверно.

2. Не могли бы вы опубликовать содержимое изображений в виде текста?

3. Не уверен, что я все делаю правильно, но я «заставил» аналогичный код работать на моей стороне, делая что-то вроде этого : const Chats: Mongo.Collection<IChat> = new Mongo.Collection('chat');

Ответ №1:

В этом случае вы пропускаете .fetch() вызов после .find() .

Возможно, математически Meteor Mongo может обрабатывать синтаксис в том виде, в каком он у вас есть сейчас, но простой способ сделать Typescript счастливым здесь — настроить его следующим образом:

 interface IChat {
    _id: string;
    name?: string
};

const Chats = new Mongo.Collection<IChat>('chat');

Chats.find().fetch().forEach(c => {
    console.log(c._id);
});
 

ссылка на решение в Typescript Playground

введите описание изображения здесь