fastify / fastify-type-provider-typebox

A Type Provider for Typebox
MIT License
153 stars 26 forks source link

Type error: TypeBoxTypeProvider does not satisfy the constraint FastifyTypeProvider #114

Open myftija opened 1 year ago

myftija commented 1 year ago

Prerequisites

Fastify version

4.24.3

Plugin version

3.5.0

Node.js version

18.15.0

Operating system

macOS

Operating system version (i.e. 20.04, 11.3, 10)

Ventura 13.5.1

Description

TypeBoxTypeProvider produces a type error in version 3.5.0. I am not facing this issue in version 3.1.0.

Steps to Reproduce

import Fastify from 'fastify'
import { TypeBoxTypeProvider } from '@fastify/type-provider-typebox'

const fastify = Fastify().withTypeProvider<TypeBoxTypeProvider>()

This produces a type error:

error TS2344: Type 'TypeBoxTypeProvider' does not satisfy the constraint 'FastifyTypeProvider'.
  Property 'input' is missing in type 'TypeBoxTypeProvider' but required in type 'FastifyTypeProvider'.

Typescript version: 5.0.4

Expected Behavior

No response

mcollina commented 1 year ago

I cannot reproduce. Can you push your file and tsconfig to a repo?

paulius-valiunas commented 2 months ago

@mcollina this happens when using pnpm, and probably recent versions of yarn (I haven't tried them but I've heard they're more restrictive than npm). You don't explicitly declare fastify as a dependency or peerDependency, but still import it in index.d.ts, which makes it a phantom dependency. It's all fine if the consumer is using npm, because npm allows phantom dependencies. But if they use pnpm, when you try to import FastifyTypeProvider from fastify, you get an unknown type because fastify is not declared as a dependency and thus not accessible from your modules: image image

Workaround:

Adding this to my package.json fixed the issue for me:

"pnpm": {
  "packageExtensions": {
    "@fastify/type-provider-typebox@^3.6.0": {
      "peerDependencies": {
        "fastify": "^4.16.0"
      }
    }
  }
}

Needless to say, I think it should be permanently fixed by adding the peerDependency to your package.

markandrus commented 2 weeks ago

The same issue occurs in recent versions of Yarn. I discovered this while updating to 5.x. The problem can be worked around by adding the following to .yarnrc.yml in a Yarn project's root:

packageExtensions:
  "@fastify/type-provider-typebox@5.x":
    peerDependencies:
      "fastify": "5.x"