typescript에서 npm 모듈을 사용하는 방법은 무엇입니까?


90

나는 타이프 스크립트를 시도하고있다. hello world 무대에서 잘 작동합니다. 이제 npm 모듈을 사용하려고합니다.

index.ts =

import _ = require('lodash')

console.log(_.toUpper('Hello, world !'))

작동하지 않습니다.

  • tsc index.ts -> Cannot find module 'lodash'. (2307)
  • node-ts index.js -> Cannot find module 'lodash'. (2307)

typescript 문서와 Google을 보면 도움이되지 않았습니다. 다른 S / O 질문은 답변되지 않았거나 ( 여기여기 ) 관련이 없습니다.

요소 :

  • typescript 1.8 최신
  • 예, lodash가 설치되어 npm i --save lodash있고 내 파일 시스템에 있습니다 (선택됨).
  • 나도했다 typings i --save lodash
  • 변형 import * as _ from 'lodash'또는 const _ = require('lodash')작동하지 않음
  • 나는 다른 답변에 제안 tsconfig.json 옵션을 조정 시도 "moduleResolution": "node"하고 "module": "commonjs"여전히 작동하지 않는, 어떤 답변에 제안

typescript에서 npm 패키지를 어떻게 사용합니까?


2
index.ts에 lodash.d.ts에 대한 참조를 추가 했습니까? 그것은이 유사하게 나타납니다 ///<reference path="../typings/lodash/lodash.d.ts"/>
Granga

@Granga 작동합니다. 이것을 대답으로 추가 할 수 있습니까?
Offirmo

2
다행이다. Blackus는 이미 답변을 추가했으며 내가 제안한 것을 더 잘 지정합니다. 하지만 한 가지 참고 : 입력 파일이 명령 줄 (귀하의 경우)에 지정되면 tsconfig.json 파일이 무시됩니다. ( 출처 )
Granga

답변:


61

[편집]이 답변에 감사드립니다! 그러나 2018 년 현재 구식입니다. 독자 여러분, 다른 답변을 살펴보십시오.

npm에서 모듈을 가져 오는 방법에는 여러 가지가 있습니다. 그러나 타이핑을 얻지 못하면 tsc항상 필요한 모듈을 찾을 수 없다고 불평합니다 (트랜스 파일 된 js 가 실제로 작동 하더라도 ).

  • 입력이 있고를 사용하지 않는 경우 tsconfig.json를 사용 reference하여 입력을 가져옵니다.

    /// <reference path="path/to/typings/typings.d.ts" />
    
    import * as _ from 'lodash`;
    
    console.log(_.toUpper('Hello, world !'))
    
  • tsconfig.json파일을 사용하는 경우 타이핑 파일이 포함되어 있는지 (또는 선택 사항이 제외되지 않았는지) 확인 import하고 이전 예제 에서 와 같이 만드십시오 .

사용 가능한 타이핑이없는 경우. 두 가지 선택이 있습니다. .d.ts파일에 직접 작성 하거나 라이브러리에 대한 유형 검사를 무시하는 것입니다.

유형 검사를 완전히 무시하려면 (권장되지 않는 방법) 유형의 변수에서 라이브러리를 가져옵니다 any.

 const _: any = require('lodash');

 console.log(_.toUpper('Hello, world !'))

tscrequire존재하지 않는다고 불평 할 것입니다 . node타이핑을 제공 하거나 declare오류를 삭제합니다.


2
3 가지 솔루션으로 완전한 답변. +1
Offirmo 16.06.06

추가 : 그것은 ts-node타이핑 인덱스가 참조되는 한도 작동합니다tsconfig.json
Offirmo

"오류를 버리도록 선언"한다는 의미로 혼란 스러웠습니다. 가져 오려는 모듈에서이 변경을 수행해야합니까?
Slug 2011

1
이 답변은 매우 구식입니다. 아래에있는 내 새로운 대답을 참조하십시오 stackoverflow.com/a/53786892/587407
Offirmo

50

[2018/12] 2016 년에 제가 물었던이 질문에 대한 새로운 최신 답변입니다. 답변은 구식 임에도 불구하고 여전히 많은 활동을 보여줍니다.

간단히 말해서 TypeScript는 패키지의 코드에 대한 유형 정보 (일명 " 유형 선언 파일 "일명 "유형")를 필요로하며 그렇지 않으면 TypeScript의 전체 요점을 잃게 될 것이라고 정당하게 알려줍니다. 이러한 솔루션을 제공하거나 옵트 아웃 할 수있는 몇 가지 솔루션이 여기에 모범 사례 순서대로 나열되어 있습니다.


솔루션 0 : 모듈이 이미 타이핑을 제공합니다. package.json에 다음과 같은 줄이 포함되어있는 경우 :

"typings": "dist/index.d.ts",

이미 TypeScript를 사용할 수 있습니다. 이 페이지를 읽고있는 경우에는 해당되지 않을 가능성이 높으므로 계속하겠습니다.


해결 방법 1 : DefinitelyTyped 에서 커뮤니티 제공 입력을 사용 합니다. 모듈 "foo"의 경우 다음을 시도하십시오.

npm add -D @types/foo

작동하면 대박! 이제 타이핑을했고 모듈을 사용할 수 있습니다. npm이 @ types / foo 모듈을 찾을 수 없다고 불평하면 계속합시다 ...


해결 방법 2 :이 모듈에 대한 사용자 지정 입력을 제공합니다. (제로 노력을 할 수있는 옵션 포함)

  1. 프로젝트의 루트에 "typings-custom"이라는 폴더를 만듭니다.
  2. tsconfig.json에서이 폴더의 내용을 참조하십시오.
"include": [
    "./typings-custom/**/*.ts"
]
  1. 다음과 같은 정확한 이름으로 파일을 생성합니다. foo.d.ts [foo = 모듈 이름] 콘텐츠와 함께 :
declare module 'foo'

TypeScript 코드는 이제 유형 정보가 없지만 컴파일되어야합니다 (TypeScript는 "any"유형의 foo 모듈을 고려함).

공식 문서 및 / 또는 DefinitelyTyped의 예제를 보고 유형 정보를 직접 작성해 볼 수도 있습니다 . 그렇다면 모듈 (모듈 작성자가 수락하는 경우 솔루션 0)에 직접 입력하거나 DefinitelyTyped (솔루션 1)에 입력하는 것을 고려하십시오.


1
@Offirmo, 단일 파일에서 여러 사용자 지정 타이핑을 선언 할 수도 있습니다! 따라서 여러 파일이 필요하지 않습니다 (어쩌면?).
lazycipher

2 단계 Reference the content of this folder in your tsconfig.json:에서 다음 오류가 발생합니다. Unknown compiler option 'include'.
Sumit

1
@Sumit 그것은 컴파일러 옵션이 아닙니다, 그것은 형제 여야합니다compilerOptions
Offirmo

22

선언 파일이 누락되었을 수 있습니다.

자세한 내용은 DefinitelyTyped 를 참조하세요.


이 시도:

npm install --save lodash
npm install --save @types/lodash

이제 가져올 수 있습니다.

import _ from 'lodash';

가져 오는 모듈에 여러 내보내기가있는 경우 다음을 수행 할 수 있습니다.

import { Express, Router } from 'express';

가져 오는 모듈에 "기본 내보내기가 없음"인 경우 다음을 수행해야합니다.

import * as http from 'http';

왜 우리는 ES6 코드에서 * as __ from 'lodash'같이 사용해야 하는가?
JohnnyQ

@JohnnyQ 좋은 지적입니다. import _ from 'lodash';이 경우 사용하는 것이 좋습니다. 다른 가져 오기 방법과 사용 이유를 보여주기 위해 내 답변을 업데이트했습니다.
Derek Soike

1
* as _ 모듈이없는 기본 내보내기가없는 경우 필요합니다. tsc 컴파일러는이를 경고합니다.
user2867342

'기본 내보내기 없음'은 정의 된 Typescript 유형이 없음을 의미합니까 (예 : 일반 JavaScript 모듈 가져 오기)? 저는 JS / Typescript를 처음 사용합니다 ....
Big Rich

2
@BigRich "기본 내보내기 없음"은 모듈에 export default <...>명령문 이 없음을 의미합니다 . Typescript Modules Documentation 의 "Default exports"섹션을 살펴보십시오 .
Derek Soike

4

그것은 나를 위해 일했습니다.

  1. "typings"라는 폴더를 만듭니다.
  2. typings 폴더에서 파일 이름 module-name.d.ts를 작성하십시오 . 다음을 포함합니다.

    declare module "module-name";

  3. tsconfig.json에서 폴더를 참조하십시오.

    "typeRoots": [ "./typings", "../node_modules/@types" ]


안녕하세요! 기여해 주셔서 감사합니다. 이 방법은 이미 내 답변에 포함되어 있으며 최후의 수단으로 만 사용해야합니다.
Offirmo

3 단계 : In tsconfig.json, refer to the folder에서 다음 오류가 발생합니다.Unknown compiler option 'typesRoots'.
Sumit

1
내 경우에는 @Sumit는 "typesRoots"는 "compilerOptions"내부
Quynh Ngo의

1
typesRoots가 아닌 typeRoots이며 compilerOptions 내부에 있어야합니다
CM

0

나는이 오류가 발생했으며 대답 중 어느 것도 나를 위해 일하지 않았지만 typescript에서 노드 모듈로 작업하고 싶을 때 무언가를 알아냅니다.

$npm install @types/<module_name>

예를 들면

npm install @types/cheerio

말하는 대신

npm install cheerio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.