typescript - Kan jag använda typdeklarationsfiler från node_modules utan att importera de faktiska modulerna?
Jag laddar teachable machine-bildbiblioteket med en skript-tagg:
<script src="https://cdn.jsdelivr.net/npm/@teachablemachine/[email /dist/teachablemachine-image.min.js"></script>
I mitt TypeScript-projekt använder jag tmImage-koden på följande sätt:
let model = await tmImage.load(modelURL, metadataURL)
Vilket ger detta fel i Typescript:
cannot find name `tmImage`
Så jag behöver typdeklarationsfiler, som inte finns tillgängliga på https://github.com/DefinitelyTyped/, men SOM finns tillgängliga i själva modulen. Så jag installerade det med:
npm install @teachablemachine/image
Nu finns det inne i node_modules många korsrefererande .d.ts-filer som innehåller all nödvändig typinformation.
Jag antog att Visual Studio Code automatiskt skulle hämta all information från .d.ts-filer i mitt projekt, men detta händer bara när jag faktiskt importerar modulerna med:
import * as tmImage from '@teachablemachine/image';
Nu känner koden igen typerna väldigt bra med kodkomplettering, men jag behöver också kompilera teachable machine-koden tillsammans med min egen kod!
Är det möjligt att använda endast typinformationen från node_modules under utvecklingstid, eller behöver jag överge min <script>-tagg och kompilera all teachable machine-kod själv, bara för att jag använder Typescript?
Svar #1
Du kompilerar inte biblioteket varje gång, du importerar det bara. Biblioteket är redan kompilerat inuti node_modules. Så du kan använda importerna och utesluta dem från din bundlare om du använder en sådan.
Om du vill att typerna ska vara tillgängliga globalt behöver du lägga till en .d.ts-fil till ditt projekt. TS förutsätter inte att en typ är tillgänglig bara för att den finns i node_modules, men du kan lägga till det genom att utöka det globala namnområdet på detta sätt:
// In a `.d.ts` file within the included folders of your project
import * as _tmImage from '@teachablemachine/image';
declare global {
const tmImage: typeof _tmImage;
}
