Importera andra TypeScript-moduler


Jag försöker importera från en TypeScript-fil som finns i node_modules. Den filen är inte transpilerad och använder TypeScript-syntax:

user.ts:
export const getUserFromToken = (token: string) => {
  return axios.get('/user', {
    headers: { authorization: `Bearer ${token}` }
  }).then(({ data }) => data)
}

Jag importerar så här: import { getUserFromToken } from 'common-files/api/user', och common-files är en modul som är registrerad i package.json.

När jag försöker kompilera får jag:

../commons/api/user.ts
Module parse failed: C:\Users\xxxx\Desktop\xxxx\commons\api\user.ts 
Unexpected token (9:38)
You may need an appropriate loader to handle this file type.
| export const getUserFromToken = (token: string) => {
|   return axios.get('/user', {
|     headers: { authorization: `Bearer ${token}` }

Vilket får mig att tro att det inte kompilerar ts-filen, eftersom när jag tar bort string-typen blir det en giltig es6-fil och den startar korrekt.

I min tsconfig.json-fil har jag:

"exclude": [
  "node_modules",
  "build",
  "scripts",
  "acceptance-tests",
  "webpack",
  "jest",
  "src/setupTests.ts"
]

Jag funderade, kanske att exkludera node_modules, förutom det paketet common-files, men vet inte hur man gör det. Finns det ett bra sätt att uppnå det jag vill alls?

Svar #1

@ShaunLuttin besvarade frågan för det allmänna fallet. Mitt problem berodde på att jag använder create-react-app med typescript-skript, och deras webpack-konfiguration tillåter inte användning av råa typescript-filer från moduler. Jag beslutade mig för att transpile alla mina filer och generera en build som kunde användas som en modul. Det fungerade, men jag var tvungen att se till att inte inkludera något som bara fungerar i Node-miljö när jag arbetar med frontend-projekt.

Svar #2

För övrigt: Det du försöker göra är okonventionellt. Vanligtvis installerar node-projekt moduler som redan har transpilerats till JavaScript.

Med det sagt, här är en uppsättning som fungerar för dig och en demo på GitHub. Eftersom ditt användningsfall är okonventionellt är lösningen komplex.

Katalogstruktur > Observera index.ts-filen inne i common-files-katalogen. Den har två syften. För det första kommer den att lista filer som vi vill att TypeScript ska transpile. För det andra, när den har transpilets kommer index.js-filen att tala om för Node att common-files-mappen är ett modul. Node-dokumentationen om mappar som moduler förklarar hur Node löser moduler.

node_modules    
  common-files
    api
      user.ts
    index.ts     <---- This file has two primary purposes.
index.ts        
package.json    
tsconfig.json   

node_modules/common-files/api/user.ts > Denna fil innehåller en deklaration som vi vill använda i din applikation.

export const getUserFromToken = (token: string) => {
    console.log("Getting the user for token " + token);
}

node_modules/common-files/index.ts > Enligt NodeJS-standardinställningar är denna index.ts-fil huvudfilen för ditt common-files-modul. Som nämnts tidigare kommer huvudfilen också att importera varje deklaration som vi vill transpileras.

import "./api/user";

index.ts > Denna fil representerar applikationen som du bygger. Vi kan importera vilken som helst av de transpilerade deklarationerna som common-files-modulen exporterar.

import { getUserFromToken } from "common-files/api/user";

getUserFromToken("some-token");

package.json > Observera att det inte finns något speciellt i din applikations node-paketfil. Det sagt, om du använde npm install för att installera common-files-paketet, skulle vi då ha common-files listat i dependencies-sektionen.

{
  "dependencies": { }, 
  "devDependencies": {
    "typescript": "^2.4.2"
  }
}

tsconfig.json > TypeScript-konfigurationen är något komplex, eftersom ditt common-files-modul behöver transpileras, och vi vill utesluta allt annat inuti node_modules. Dokumentationen för tsconfig har mer information om hur filer, include och exclude samverkar.

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs"
  },
  "files": [
    "node_modules/common-files/index.ts"
  ],
  "include": [
    "**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

Konsolutdata för ovanstående uppsättning ser ut så här:

> .\node_modules\.bin\tsc
> node index.js
Getting the user for token some-token

Relaterade artiklar