Przejdź do treści

TypeScript GraphQL dla MongoDB — Numio

Generuje typy dokumentów TypeScript MongoDB na podstawie schematu z adnotacjami @entity, @id, @column, @link, @embedded i @map przy użyciu @graphql-codegen/typescript-mongodb. Każdy typ @entity otrzymuje typ <Name>DbObject; pola bez dyrektywy są pomijane.

Zachowywanie zapisanego kształtu dokumentu MongoDB wpisanego obok typów GraphQL API tej samej jednostki.

GraphQL Schema

TypeScript MongoDB

Kiedy go używać

  • Zachowywanie zapisanego kształtu dokumentu MongoDB wpisanego obok typów GraphQL API tej samej jednostki.
  • Sprawdzanie, jak ścieżki @map i odniesienia @link przekładają się na zagnieżdżone obiekty i tablice ObjectId przed napisaniem kodu dostępu do danych.

Jak używać

  1. Wklej schemat, którego typy używają @entity i których pola używają @id, @column, @link, @embedded lub @map(path: ...).
  2. Przeczytaj typy DbObject pod koniec wyjścia; nad nimi generowane są same typy GraphQL.
  3. Skopiuj wynik do pliku .ts; importuje ObjectId z pakietu mongodb.

Schemat GraphQL z dyrektywami MongoDB

type User @entity {
  id: ID! @id
  email: String! @column @map(path: "login.email")
  profile: Profile! @embedded
  posts: [Post!]! @link
}

type Profile @entity(embedded: true) {
  name: String! @column
}

type Post @entity {
  id: ID! @id
  title: String! @column
}

Typy TypeScript DbObject

…
export type AdditionalEntityFields = {
  path?: InputMaybe<Scalars["String"]["input"]>
  type?: InputMaybe<Scalars["String"]["input"]>
}

import { ObjectId } from "mongodb"
export type UserDbObject = {
  _id: ObjectId
  login: {
    email: string
  }
  profile: ProfileDbObject
  posts: Array<PostDbObject["_id"]>
}

export type ProfileDbObject = {
  name: string
}

export type PostDbObject = {
  _id: ObjectId
  title: string
}

Szczegóły i ograniczenia

@id staje się _id: ObjectId, @link staje się _id połączonej jednostki (Array<PostDbObject["_id"]> dla list), a @map(path: "login.email") tworzy zagnieżdżony obiekt logowania.

Pola bez dyrektywy (brak @column, @id, @link, @embedded) nie są uwzględniane w typie DbObject; kolumny dopuszczające wartość null stają się opcjonalnymi właściwościami Maybe<T>.

Dane wyjściowe zawierają również standardowe typy wtyczek TypeScript (pominięte powyżej). Generowanie odbywa się w środowisku internetowym w przeglądarce.

FAQ

Czy muszę deklarować dyrektywy @entity i @column w moim schemacie?

Nie. Wtyczka dodaje własne definicje dyrektyw, dlatego też na wyjściu pojawia się typ wejścia AdditionalEntityFields.

W jaki sposób wpisywane są osadzone dokumenty?

Typ zadeklarowany z @entity(embedded: true) otrzymuje typ DbObject bez _id, a pole oznaczone @embedded odwołuje się do niego, na przykład profil: ProfileDbObject.

Dlaczego w typie DbObject brakuje pola?

Przechowywane są tylko pola z @id, @column, @link, @embedded lub @map. Dodaj @column, aby uwzględnić zwykłe pole.

Specyfikacje i referencje