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.