typescript - vscode nu poate găsi definițiile de tip typeRoots


Încerc să am un singur fișier care să conțină cele mai multe dintre definițiile de tip care vor fi folosite în întreaga aplicație, am creat un folder numit @types și un fișier index.d.ts care exportă fiecare interfață/tip pe care îl vreau.

Am actualizat fișierul meu tsconfig.json pentru a include acel folder:

{
    "compilerOptions": {
        "outDir": "./built",
        "allowJs": true,
        "target": "es5",
        "jsx": "react",
        "allowSyntheticDefaultImports": true,
        "lib": [
            "es2015"
        ],
        "typeRoots": [
            "./@types"
        ],
    },
    "include": [
        "./client/**/*",
        "./@types/**/*"
    ],
    "awesomeTypescriptLoaderOptions": {
        "silent": true,
        "errorsAsWarnings": true
    }
}

Chiar dacă, atunci când în cod (în interiorul client/...) fac referire la una dintre interfețele prezente în index.d.ts, vscode aruncă un „Nu s-a putut găsi numele”.

Există o modalitate mai bună de a rezolva asta?

Definiția interfeței este prezentă în interiorul @types/index.d.ts.

export interface Agent {
    name: string;
...
}

Utilizare :

interface Props extends RouteComponentProps<any> {
    agent?: types.Agent;
}

Răspuns #1

Deoarece folosești cuvântul cheie export, @types/index.d.ts este tratat ca un modul, iar singura modalitate de a accesa tipurile din acesta este să le imporți. De exemplu, după ce faci următoarele, ai putea să te referi la types.Agent:

import * as types from "../path/to/@types/index";

S-ar putea să doriți să eliminați toate aparițiile lui export astfel încât @types/index.d.ts să fie tratat ca un fișier de declarație globală și să puteți face referire la tipuri pur și simplu ca Agent. Sau puteți pune tipurile într-un namespace numit types și apoi să faceți referire la types.Agent.

Opțiunea de compilator typeRoots nu este relevantă. Ea indică compilatorului unde să găsească pachetele cu declarații care trebuie încărcate, dar problema ta nu este încărcarea declarațiilor (deoarece @types/index.d.ts se potrivește cu include), ci mai degrabă importarea lor.