typescript - ts Kan inte hitta namn ... med typeRoots specificerat uttryckligen
Jag arbetar på en monorepo-struktur för mitt TypeScript 3.0.3-projekt, den förenklade strukturen ser ut så här
_types/
models.ts
package.json
tsconfig.json
packages/
app/
tsconfig.json
package.json
server/
tsconfig.json
package.json
Så jag placerar mina globala gränssnitt i _types-mappen, ett exempel på models.ts ser ut så här
interface ICharacterEssentials {
username: string
gender: 'MALE' | 'FEMALE'
skinTone: 'DARK' | 'LIGHT'
race: 'HUMAN' | 'ORC' | 'ELF' | 'DWARF'
}
Detta gränssnitt används sedan inne i min packages/server/index.ts-fil, men jag får ett fel
[ts] Kan inte hitta namnet 'ICharacterEssentials'.
Min första instinkt var att det inte ser detta eftersom gränssnittsfilen är utanför /packages/server-mappen. Så jag gick in i min monorepos rot tsconfig.json och lade till detta biten inuti compilerOptions
"typeRoots": [
"./_types/*",
"./node_modules"
]
Min packages/server/tsconfig.json-fil utökar detta på följande sätt
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"noImplicitReturns": true,
"outDir": "./dist"
},
"exclude": [
"./dist"
]
}
Jag antog att detta skulle göra mitt ICharacterEssentials-gränssnitt synligt inom mitt serverpaket, men jag får fortfarande samma fel. Några råd om hur man löser detta? (samtidigt som typdefinitionerna för mina nodmoduler bevaras)
Svar #1
Ditt huvudsakliga problem är att du inte exporterar gränssnittet. Försök:
export interface ICharacterEssentials {
username: string
gender: 'MALE' | 'FEMALE'
skinTone: 'DARK' | 'LIGHT'
race: 'HUMAN' | 'ORC' | 'ELF' | 'DWARF'
}
Du angav att orsaken till denna konfiguration på tsconfig.json...
"typeRoots": [
"./_types/*",
"./node_modules"
]
... var ett försök att göra rot typer synliga inuti paketen. Detta är onödigt. TypeScript kommer automatiskt att söka efter typer var som helst, om du inte anger det. En anledning till att du kanske vill göra detta är dock att förhindra att roten av ditt monorepo får åtkomst till typer definierade inuti varje enskilt paket. Det är upp till dig.
Att utöka bas-tsconfig.json i varje paket är inte nödvändigt för typupplösning. Jag skulle gå ännu längre och uppmana dig att ifrågasätta om du verkligen vill ha individuella tsconfig.json för varje paket i monorepot. Jag arbetar på ett stort TypeScript-monorepo och vi har inga individuella tsconfig.json för varje paket.
Tillbaka till din fråga. Intressant nog föreslog inte Visual Studio Code en automatisk import av den yttre ICharacterEssentials inuti den nästlade mappen i mitt testprojekt, men WebStorm gjorde det, och naturligtvis fungerar det oavsett vilken editor man använder.
