Typescript : 모듈 외부에서 import 문을 사용할 수 없습니다


19

기본 내보내기없이 노드 모듈을 가져 오는 node js (07.10.19의 최신 버전 node.js) 앱에 .ts 파일이 있습니다. 이 구성을 사용 import { Class } from 'abc';합니다. 코드를 실행할 때이 오류가 발생 Cannot use import statement outside a module합니다.

네트워크 에서이 문제 (.js의 경우)에 대한 많은 솔루션을 볼 수 있지만 typescript 파일이 있기 때문에 도움이되지 않습니다. 내 코드는 다음과 같습니다.

import { Class } from 'abc';
module.exports = { ...
    execute(a : Class ,args : Array<string>){ ...

내 tsconfig.json은 다음과 같습니다.

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",

    "strict": true
  }
}

브라우저에서 이것을 실행하고 있습니까? 는 IS import문은 파일의 첫 번째 행?
— Evert

1
tsconfig.json 파일을 게시 할 수 있습니까? Typescript에서 컴파일 할 때 생성하는 모듈 유형을 결정할 수 있으며 유효한 유형은 사용하는 환경 (브라우저 / NodeJS)과 다른 모듈 ( requirevs import)에 따라 다를 수 있습니다. 이것이 얼마나 복잡한 지 이해하기 위해 Node에는 vs 와 함께 작동시키는 방법에 대한 문서 가 있습니다. importrequire
— Jeff Bowman

1
module.exports구문 을 사용 하는 경우 ES6 모듈이 아닐 수 있습니다.
— Bergi

Evert, 이것은 노드 js 앱입니다. tsconfig가 곧 추가 될 예정입니다.
— Zerumi

좋아, 나는 건설을 사용할 때 네임 스페이스 'abc'를 찾을 수 없기 때문에 요구를 사용할 수 없다execute(a : abc.Class...
— Zerumi

답변:


5

“type”: “module”package.json에 추가하면 Node에서 ES2015 모듈을 사용하고 있으며 오류를 제거해야하지만 tsconfig.json “module”: “es2015”대신 설정하여이 유형의 모듈을 생성하도록 Typescript에 지시해야합니다 “commonjs”.

그러나 ES6 import {}문을 사용하고 있지만 commonJS module.exports = {}구문을 사용하여 내보내는 경우 Node의 ES 모듈 로더에 문제가 있기 때문에 현재 코드 에 문제가 발생합니다. 이를 처리하는 두 가지 방법이 있습니다.

  1. module.exports그러나 파일 에 .cjs 확장자를 부여 하여이 파일을 commonJS로 해석하도록 Node에 지시 하십시오 .
  2. 내보내기 문을 ES2015 구문으로 변경하십시오. export function execute(…)..

첫 번째 옵션은 컴파일러가 .js 파일을 출력하므로 항상 아는 한 .cjs로 변경해야하기 때문에 약간 까다로울 수 있습니다. 두 번째 옵션을 사용하면 Node를 사용하여 파일을 실행할 수 있어야합니다 (버전 13.8의 경우 --experimental-modules 플래그 포함).

commonJS를 반드시 사용해야하는 경우 Node : @ types / node에 대한 유형 정의를 설치하고 import를 commonJS 형식으로 변경 require('abc')하고 나머지 설정을 그대로 유지하는 것이 좋습니다 ( "type"을 추가 할 수는 있음) : package.json에 대한“commonjs”는 명시 적입니다.


1
클래스는 .ts 정의에서 사용할 수 없습니다 (예 : 클래스) ... .cjs 확장자 정보 ... 유형은 .ts 파일에만있을 수 있습니다 ... 이 모듈은 어디에서나 오래된 가져 오기 (필수)가 있습니다 ... JSDoc을 사용 하여이 문제를 해결했습니다. 그러나 답변 주셔서 감사합니다
— Zerumi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.