javascript - Typescript: lös relativ importväg när du använder symboliska länkar
Det här verkar vara en dum fråga, men jag har svårt att hitta svaret.
Situationen
Här är min mappstruktur:
myProject/
├── module1/
│ ├── config.ts
│ └── init.ts #symlink
├── module2/
│ ├── config.ts
│ └── init.ts #symlink
└── symlinks/
└── init.ts # the real not duplicated file
Filen init.js importerar lokala filer på följande sätt:
import config from './config'
// ...
Problemet
Problemet är att TypeScript kastar Cannot find module './config' or its corresponding type declarations
Jag försökte leka med TypeScript-alternativet preserveSymlinks men det löste inte mitt problem
Jag känner till andra sätt att uppnå mitt mål men det är överdrivet för bara en fil och det löser inte beroendet av en relativ sökväg (som att skapa ett npm-modul, skapa en funktion och skicka innehållet i den relativa filen som parameter eller till och med generera filer vid körning...)
=> Jag arbetar med typescript i ett monorepo.
Är det möjligt att använda symboliska länkar på det här sättet? Om inte, finns det andra (enkla) alternativ?
REDIGERA: Jag har gjort detta exempelrepo, du kan använda det som en bas för experiment
Svar #1
Som standard löser TypeScript moduler baserat på filens fysiska sökväg, inte den lösta sökvägen efter att ha följt några symboliska länkar. Så i ditt fall, när du försöker importera config från ./config, letar TypeScript efter filen på den fysiska sökvägen myProject/module1/config.ts eller myProject/module2/config.ts, men den ligger faktiskt på myProject/symlinks/config.ts.
Du kan tala om för TypeScript att lösa moduler baserat på den lösta sökvägen genom att ställa in alternativet resolveSymlinks till true i din tsconfig.json-fil:
{
"compilerOptions": {
// ...
"resolveSymlinks": true
},
// ...
}
Detta kommer att få TypeScript att följa symboliska länkar när moduler löses, så det bör kunna hitta din config-fil. Observera att du också kan behöva sätta preserveSymlinks till true om du använder verktyg som Webpack som kan ändra den lösningsbara sökvägen.
Ett annat alternativ är att använda modulalias i din tsconfig.json-fil för att mappa ./config-sökvägen till rätt plats. Till exempel:
{
"compilerOptions": {
// ...
"baseUrl": ".",
"paths": {
"*": ["*", "symlinks/*"]
}
},
// ...
}
Detta kommer att tala om för TypeScript att söka efter alla moduler i symlinks-katalogen, samt i deras ursprungliga platser. Sedan kan du importera config på detta sätt:
import config from 'module1/config';
Detta bör fungera oavsett om init.ts är en symbolisk länk eller en vanlig fil.
