Правильный ввод метода поиска MongoDB в TypeScript

Я работаю над проектом TypeScript, который включает MongoDB, и у меня возникают проблемы с правильным вводом метода find MongoDB. Ниже приведен фрагмент кода, с которым я работаю:

import { ReitsType } from '@/app/api/types/reits';
import { NextRequest, NextResponse } from 'next/server';
import { db } from '../mongo';
import { ActionsType } from '../types/actions';

export async function GET(req: NextRequest) {
    console.info(req);
    const sortKey: keyof ReitsType | keyof ActionsType =
        'averageDy5YearsRanking';
    try {
        const collection = db.collection('reits');
        const documents = await collection
            .find<ReitsType | ActionsType>({
                averageDy5YearsRanking: { $gte: 5 }
            })
            .sort({ [sortKey]: 1 })
            .toArray();
        return NextResponse.json(documents);
    } catch (error) {
        console.error('Error while fetching data:', error);
        return NextResponse.error();
    }
}

Проблема в том, что я не могу определить правильный тип документа, который будет возвращен методом find. Интерфейсы ReitsType и AtionsType представляют возможные типы, но кажется, что типизация не распознается должным образом TypeScript.

Я хотел бы понять, как мне правильно набрать метод find, чтобы TypeScript распознал возвращаемый тип документа и предоставил мне соответствующую поддержку кода, такую ​​как автозаполнение свойств и выявление возможных ошибок типа.

Метод поиска правильного типа с mongodb

🤔 А знаете ли вы, что...
Node.js позволяет использовать один и тот же язык (JavaScript) на клиентской и серверной стороне.


1
50
1

Ответ:

Решено
// you have to add the type here 
const collection = db.collection<ReitsType>('reits');

тогда, когда вы пишете:

 const documents = await collection.find()

typescript автоматически выведет типы для documents и автоматически заполнит. если ты напишешь

const documents = await collection.find().sort(whileCursorHere)

нажмите на CTRL + SPACE, вы увидите варианты

Но если вам нужно указать ключи сортировки

 const documents = await collection.find().sort({key:1})

После того, как вы нажмете CTRL+SPACE, пока курсор находится в sort({whileCursorHere}), вы можете ожидать увидеть ключи вашего типа, в вашем примере MyData,

interface MyData {
  name: string;
  age: number;
  adress: string;
}

вы можете захотеть увидеть автозавершение для name, age или address, но вы этого не сделаете, потому что это метод типа fort sort

sort(sort: Sort, direction?: SortDirection | undefined): FindCursor<WithId<MyData>>

и тип Sort не за исключением универсального

export declare type Sort = string | Exclude<SortDirection, {
    $meta: string;
}> | string[] | {
    [key: string]: SortDirection;
} | Map<string, SortDirection> | [string, SortDirection][] | [string, SortDirection];