node.js - Ο πάροχος τύπου json-schema-to-ts του Fastify δεν λειτουργεί


Προσπαθώ να υλοποιήσω συμπερασμό τύπων από το JSON schema στο Fastify.

Αυτό το παράδειγμα από την τεκμηρίωση δεν λειτουργεί για μένα, καθώς το request.query παραμένει άγνωστο ή μερικές φορές {}.

Εδώ είναι ένα άμεσο αντιγραφή-επικόλληση της τεκμηρίωσης στο stackblitz. Όπως μπορείτε να δείτε, η μεταγλώττιση του Typescript αποτυγχάνει.

Κάποια ιδέα;

Απάντηση #1

Ο τύπος Querystring δεν έχει οριστεί, γι' αυτό προκύπτει το σφάλμα. Για να τον ορίσετε κάντε το εξής:

import { JsonSchemaToTsProvider } from '@fastify/type-provider-json-schema-to-ts';

import fastify from 'fastify';

const server = fastify().withTypeProvider<JsonSchemaToTsProvider>();

server.get<{ Querystring: { foo: number, bar: string } }>(
  '/route',
  {
    schema: {
      querystring: {
        type: 'object',
        properties: {
          foo: { type: 'number' },
          bar: { type: 'string' },
        },
        required: ['foo', 'bar'],
      },
    } as const, // don't forget to use const !
  },
  (request, reply) => {
    const { foo, bar } = request.query; // type safe!
  }
);

Ή, για να το κρατήσετε DRY, εγκαταστήστε το πακέτο @sinclair/typebox και ορίστε το εκ των προτέρων όπως:

import { JsonSchemaToTsProvider } from '@fastify/type-provider-json-schema-to-ts';

import fastify from 'fastify';
import { Static, Type } from '@sinclair/typebox';

const server = fastify().withTypeProvider<JsonSchemaToTsProvider>();

const getQuerystring = Type.Object({
  foo: Type.Number(),
  bar: Type.String(),
})

type GetQuerystring = Static<typeof getQuerystring>

server.get<{ Querystring: GetQuerystring }>(
  '/route',
  {
    schema: {
      querystring: getQuerystring,
    } as const, // don't forget to use const !
  },
  (request, reply) => {
    const { foo, bar } = request.query; // type safe!
  }
);

Απάντηση #2

αυτό λύνει το πρόβλημα (:

npm i json-schema-to-ts