Я работаю над проектом 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) на клиентской и серверной стороне.
// 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];