How to solve the following typescript error: "Cannot find namespace 'fastify'"?

Viewed 2277

I recently decided to upgrade all my packages on my fastify-server template.

My package.json is looking like this:

{
    "name": "backend-template",
    "version": "1.0.0",
    "description": "",
    "author": "",
    "license": "ISC",
    "main": "server.ts",
    "scripts": {
        "build": "tsc",
        "test": "jest",
        "start": "node dist/server.js",
        "dev": "cross-env NODE_PATH=src nodemon",
        "lint": "eslint src --ext .js,.ts --max-warnings 0"
    },
    "dependencies": {
        "@types/pg": "^7.14.4",
        "apollo-server-fastify": "^2.17.0",
        "app-module-path": "^2.2.0",
        "axios": "^0.20.0",
        "bcrypt": "^5.0.0",
        "bytebuffer": "^5.0.1",
        "cls-hooked": "^4.2.2",
        "cls-proxify": "^1.0.1",
        "dataloader": "^2.0.0",
        "dotenv": "^8.2.0",
        "fastify": "^3.3.0",
        "fastify-compress": "^3.3.0",
        "fastify-cors": "^4.1.0",
        "fastify-file-upload": "^3.0.0",
        "fastify-gql": "^5.4.0",
        "fastify-helmet": "^5.0.1",
        "fastify-multipart": "^3.1.0",
        "fastify-plugin": "^2.3.3",
        "fastify-swagger": "^3.3.0",
        "fluent-schema": "^1.0.4",
        "graphql": "^15.3.0",
        "graphql-type-datetime": "^0.2.4",
        "graphql-upload": "^11.0.0",
        "httperrors": "^2.3.0",
        "jsonwebtoken": "^8.5.1",
        "jwks-rsa": "^1.9.0",
        "lodash": "^4.17.20",
        "monotonic-id": "^1.1.0",
        "mysql": "^2.18.1",
        "mysql2": "^2.1.0",
        "node-cache": "^5.1.2",
        "pino": "^6.5.1",
        "pino-pretty": "^4.2.0",
        "sequelize": "^6.3.4",
        "stream-buffers": "^3.0.2",
        "stream-to-blob": "^2.0.1",
        "uuid": "^8.3.0",
        "uuid-parse": "^1.1.0",
        "validator": "^13.1.1"
    },
    "devDependencies": {
        "@types/axios": "^0.14.0",
        "@types/jest": "^26.0.10",
        "@types/validatorjs": "^3.15.0",
        "@typescript-eslint/eslint-plugin": "^3.10.1",
        "cross-env": "^7.0.2",
        "eslint": "^7.7.0",
        "eslint-config-airbnb-typescript": "^9.0.0",
        "eslint-plugin-import": "^2.22.0",
        "eslint-plugin-jest": "^23.20.0",
        "eslint-plugin-prettier": "^3.1.4",
        "husky": "^4.2.5",
        "jest": "^26.4.2",
        "lint-staged": "^10.2.13",
        "nodemon": "^2.0.4",
        "prettier": "^2.1.1",
        "ts-jest": "^26.3.0",
        "ts-node": "^9.0.0",
        "typescript": "^4.0.2"
    },
    "lint-staged": {
        "src/**/!(*test).{js,ts,json}": [
            "prettier --write",
            "eslint --max-warnings 0",
            "git add"
        ]
    },
    "husky": {
        "hooks": {
            "pre-commit": "lint-staged"
        }
    }
}

ts.config:

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": "src",
    "resolveJsonModule": true
  },
  "lib": ["es2015"],
  "include": ["src"]

}

But when I run npm run dev

I am getting the following errors:

node_modules\ts-node\src\index.ts:500
    return new TSError(diagnosticText, diagnosticCodes)

TSError: ⨯ Unable to compile TypeScript: src/app.ts:44:6 - error TS2503: Cannot find namespace 'fastify'.

44 } as fastify.ServerOptionsAsHttp); ~~~~~~~ src/app.ts:83:38 - error TS2503: Cannot find namespace 'fastify'.

83 (request): CreateClsProxyFastify<fastify.FastifyRequest, fastify.FastifyReply<http.ServerResponse>> => ~~~~~~~ src/app.ts:83:62 - error TS2503: Cannot find namespace 'fastify'.

83 (request): CreateClsProxyFastify<fastify.FastifyRequest, fastify.FastifyReply<http.ServerResponse>> =>

Node version:

v14.9.0

What can I do?

1 Answers

I ran into the same issue and for me this was solved by importing the types explicitly.

I.e. instead of

import fastify from 'fastify';

I used

import { FastifyReply } from 'fastify';

I also used FastifyReply instead of FastifyReply<http.ServerResponse>, as http.ServerResponse is already the default.

Related