next.js - Brug brugerdefineret TypeScript-typning .d.ts i nextjs (Modul ikke fundet: Kan ikke finde ...)
Jeg bruger et JS-bibliotek, som ikke leverer @type-definitioner til TypeScript, så jeg har lavet min egen .d.ts-fil. Lad os kalde den foo.d.ts. Min projektstruktur ser sådan her ud:
...
.next/
pages/
...
typings/
foo.d.ts
...
tsconfig.json
Min VS Code har ingen problemer med den definition, og jeg kan importere i min komponent, som:
import {Foo} from "foo";
Men under køretid får jeg denne fejl i browserens konsol
Modul ikke fundet: Kan ikke finde 'foo'
Jeg har forsøgt at tilføje
"typeRoots": [ "node_modules/@types", "typings" ]
til min tsconfig.json, men det hjalp ikke. Jeg har også prøvet at tilføje foo.d.ts eksplicit til include-sektionen, hvor next-env.d.ts er tilføjet.
foo.d.ts ser sådan ud:
declare module 'foo' {
declare interface ValidationError {
message?: string;
}
declare namespace Foo {
class Bar {
constructor(config: any, displayErrorsCallback: (data: ValidationError[]) => void, onSubmitTriggered: () => void);
}
}
}
Opdatering (tilføjet tsconfig)
{
"compilerOptions": {
"target": "es6",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"typeRoots": [
"node_modules/@types",
"typings"
]
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules"
]
}
Svar #1
Tilføj bare .d efter filnavnet, så importer din typedefinition som import {Foo} from "foo.d"; Når du importerer *.d.ts, importer dem sådan, der er ikke behov for at ændre konfigurationer.
Svar #2
Med NextJS 14 stødte jeg på dette problem i dag.
Til sidst var jeg nødt til at specificere typeRoots på denne måde (det var ikke specificeret før og brugte en standard, jeg ikke kender til):
"typeRoots": [
"@typings",
"node_modules",
"node_modules/@types"
],
Forklaringen (hvis jeg tager fejl på den korrekte måde):
@typingser min egen mappe til eksterne typer (indeholder kun d.ts-filer)node_moduleskan indeholde d.ts-typer, da nogle pakker udgiver disse sammen med deres kilder (dette var det, jeg manglede, og som gjorde, atnext buildbrød sammen)node_modules/@typeser hvor moduler udgiver deres typinger (bedste praksis, men ikke altid fulgt)
Den fulde tsconfig.json-fil:
{
"$schema": "https://json.schemastore.org/tsconfig",
"display": "Next.js",
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noUncheckedIndexedAccess": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"baseUrl": ".",
"types": [
"node",
"jest",
"@testing-library/jest-dom"
],
"typeRoots": [
"@typings",
"node_modules",
"node_modules/@types"
],
"plugins": [
{
"name": "next"
}
]
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
"**/*.mjs",
"jest.config.js",
".next/types/**/*.ts"
],
"exclude": [
"node_modules"
]
}
