TypeScript 오류 TS2304 : 이름 'require'을 (를) 찾을 수 없습니다.


463

첫 번째 TypeScript 및 DefinitelyTyped Node.js 응용 프로그램을 시작하고 실행 중이며 일부 오류가 발생하려고합니다.

간단한 TypeScript Node.js 페이지를 변환하려고하면 "TS2304 : 이름 '필수'를 찾을 수 없습니다"라는 오류가 발생합니다. Stack Overflow 에서이 오류가 여러 번 발생했으며 비슷한 문제가 있다고 생각하지 않습니다. 쉘 프롬프트에서 다음 명령을 실행 중입니다.

tsc movie.server.model.ts.

이 파일의 내용은 다음과 같습니다.

'use strict';

/// <reference path="typings/tsd.d.ts" />

/*    movie.server.model.ts - definition of movie schema */

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var foo = 'test';

var mongoose=require('mongoose')라인 에 오류가 발생 합니다.

typings / tsd.d.ts 파일의 내용은 다음과 같습니다.

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

.d.ts 파일 참조는 적절한 폴더에 배치되어 다음 명령에 의해 typings / tsd.d.ts에 추가되었습니다.

tsd install node --save
tsd install require --save

생성 된 .js 파일이 제대로 작동하는 것처럼 보이므로 오류를 무시할 수 있습니다. 그러나이 오류가 발생하는 이유와 내가 뭘 잘못하고 있는지 알고 싶습니다.


1
when I attempt to transpile a simple ts node page<어떻게 당신이 transpiling ... 어떤 유틸리티
basarat

1
tsc movie.server.model.ts 명령을 입력하여 명령 행에서 실행 중입니다. 다음은 Mac에 있습니다.
JerryKur

1
Visual Studio Code를 사용하는 IDE에서도 동일한 문제가 발생했습니다. 다른 IDE 인 IntelliJ를 사용해보십시오. 커맨드 라인에 드롭하는 것이이 문제를 테스트하는 가장 깨끗한 방법이라고 가정했습니다.
JerryKur


어때요 import { mongoose } from 'mongoose'?
FisNaN

답변:


744

빠르고 더러운

require를 사용하여 파일이 하나만 있거나 데모 목적으로이 작업을 수행하는 경우 TypeScript 파일 맨 위에 require를 정의 할 수 있습니다.

declare var require: any

TypeScript 2.x

TypeScript 2.x를 사용하는 경우 더 이상 타이핑 또는 한정된 유형을 설치할 필요가 없습니다. 다음 패키지를 설치하십시오.

npm install @types/node --save-dev

선언 파일의 미래 (6/15/2016)

Typings 및 tsd와 같은 도구는 계속 작동하며 원활한 전환을 위해 해당 커뮤니티와 함께 ​​작업 할 것입니다.

다음을 포함하도록 src /tsconfig.app.json을 확인하거나 편집하십시오 .

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

파일이 src 폴더에 있고 루트 app 폴더에없는 파일인지 확인하십시오 .

이러한 옵션 중 하나를 지정 하지 않으면 @types 아래의 모든 패키지가 이미 빌드에 포함되어 있습니다. 더 읽어보기

TypeScript 1.x

타이핑 (DefinitelyTyped 대체)을 사용하면 GitHub 리포지토리에서 직접 정의를 지정할 수 있습니다.

타이핑 설치

npm install typings -g --save-dev

DefinitelyType의 저장소에서 requireJS 유형 정의를 설치하십시오.

typings install dt~node --save --global

웹팩

Webpack을 빌드 도구로 사용하는 경우 Webpack 유형을 포함 할 수 있습니다.

npm install --save-dev @ types / webpack-env

tsconfig.json아래에서 다음으로 업데이트하십시오 compilerOptions.

"types": [
      "webpack-env"
    ]

이를 통해 require.ensure다른 웹팩 특정 기능 을 수행 할 수 있습니다 .

앵귤러 CLI

CLI를 사용하면 위의 Webpack 단계를 수행하고 "types"블록을에 추가 할 수 있습니다 tsconfig.app.json.

또는 사전 설치된 node유형을 사용할 수 있습니다. 여기에는 실제로 사용할 수없는 클라이언트 측 코드에 대한 추가 유형이 포함됩니다.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }

4
왜 "typings install --save --ambient require"가 아닌가?
kutomer

1
이 오류가 발생합니다 Unable to find "require" ("npm") in the registry. 더 큰 nodeJS 유형 세트의 일부가 필요합니까?
dcsan 2016 년

7
나는 이것이 내장 노드가 아닌 requireJS에 대한 타이핑과 관련하여 잘못되었습니다 require. ES5 출력 대상의 일부 변형에 대한 정답 일 수도 있지만 일반적인 경우는 아닙니다.
dcsan

1
Jordan Awnser를 참조하십시오. 필자의 경우 다음 @types를 설치하여-> "types": [ "node", "es6-promise", "core-js", "jasmine"] <-를 tsconfig.json의 compilerOptions에 추가했습니다.
Lothre1

1
@Seagull @types/node은 TypeScript 정의입니다. 노드는 이들을 포함하지 않으며 포함해서는 안됩니다.
cgatian

103

TypeScript 2.x 의 경우 다음 두 단계가 있습니다.

  1. 를 정의하는 패키지를 설치하십시오 require. 예를 들면 다음과 같습니다.

    npm install @types/node --save-dev
  2. TypeScript에 전역으로 포함 시키도록 지시하십시오 tsconfig.json.

    {
        "compilerOptions": {
            "types": ["node"]
        }
    }

두 번째 단계는와 같이 전 세계적으로 사용 가능한 기능에 액세스해야하는 경우에만 중요합니다 require. 대부분의 패키지에서는 import package from 'package'패턴을 사용해야합니다 . 위의 tsconfig.json types 배열에 모든 패키지를 포함시킬 필요는 없습니다.


1
es5 github.com/Microsoft/TypeScript/wiki/에 lib를 사용할 수 있습니다. Eq : "lib": [ "dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro

추가 한 후 "types": ["jasmine", "hammerjs"]tsconfig.js내가 추가 HADE node아니라. 고마워 요르단.
Mikeumus

이 조언을 따르면 수입품이 모두 파손됩니다. 예를 들어, import express from "express";이제 @ types / express를 설치하거나 .d.ts 파일을 추가해야한다고 알려줍니다.
austinthemassive

4
당신이 더 많은 경우 @types/...보다는 그냥 @types/node폴더를 추가하지 마십시오 "types": ["node"]에서 tsconfig.json타이프 라이터의 compiller 다른되지 언급 한 패키지를 생략 때문이다. IDE 유형 분석이 중단됩니다. 그것은 여기에 기록 typescriptlang.org/docs/handbook/...
Marecky

문제없이 이온 프로젝트에 나를 위해 그 솔루션 작품 :) 감사합니다
프랜 샌디에게

71

당신은 할 수 있습니다

declare var require: any

또는보다 포괄적 인 지원을 위해서는 DefinitelyTyped의 require.d.ts를 사용하십시오.

또한 대신에 var mongoose = require('mongoose')다음을 시도해보십시오.

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')

1
use strictTypeScript에서 사용 하는 것 : TypeScript 파일에 필요한 basarat answer“Strict 사용”? . 사용할 필요가 use strict타이프 라이터에.
유진 비첼

흠, 그 답변에 따르면 그것은 필요하지 않지만 사용하는 것이 유리할 수 있습니다 "use strict", 나는 대답을 편집 할 것입니다
ᆼ ᆺ ᆼ

선언 var require를 사용하면 실제 문제가 해결되지 않습니다. 그냥 숨기고
My Stack Overfloweth

@Ant 맞아요, 이것은 2015 년의 것이라는 것을 명심하십시오. 또한 수정해야 할 "문제"가 없다고 주장합니다. TypeScript 2.0은 이제 이것을 우아하게 해결합니다
ᆼ ᆺ ᆼ

12

이 답변은 최신 설정과 관련이 있습니다 (TypeScript 2.x, Webpack > 2.x).

당신은 하지 않습니다 설치해야 @ Node.js를 유형의 모든이며, 프런트 엔드 코드에 대한 무관 유형 / 노드를 (실제로 일을 복잡 등등 setTimout 다른 반환 값으로 ..

당신은 유형 @ 설치할 필요가 / 웹팩-ENV

npm i -D @types/webpack-env

이는 웹팩는 (포함 있는지 런타임 서명 부여 require, require.ensure등)

또한 tsconfig.json 파일에 'types'배열이 설정되어 있지 않은지 확인하십시오-> node_modules / @ types 폴더에서 모든 유형 정의를 가져옵니다.

유형 검색을 제한하려면 typeRoot 특성을 node_modules / @ types로 설정할 수 있습니다.


1
이 중요한 발언이다 >를 픽업하여 node_modules / @ 종류의 폴더에있는 모든 유형 정의 할 것이다 - 또한 확인하십시오 tsconfig.json없이 세트 '유형'배열을 가지고있는 것을 확인
Marecky

웹팩 접근 방식에 필요한 다른 단계가 있습니까? '오류 TS2580 :'require '이름을 찾을 수 없습니다'라는 컴파일 오류가 발생합니다.
jaycer

10

대신에:

'use strict';

/// <reference path="typings/tsd.d.ts" />

시험:

/// <reference path="typings/tsd.d.ts" />

'use strict';

즉, 참조 경로가 먼저입니다.


작동하지만 더러운 IMO의 종류-기본적으로 오류를 수정하는 대신 오류를 숨 깁니다. 데모 및 빠른 스크립트에 적합하지만 프로덕션에는 적합하지 않음
Nino Filiu

8

제 경우 src/tsconfig.app.json에는 tsconfig.json설정 을 재정의 하는 매우 어리석은 문제 였습니다 .

그래서 나는 이것을 가지고 있었다 tsconfig.json:

    "types": [
      "node"
    ]

그리고 이것은 src/tsconfig.app.json:

    "types": []

이 오류로 인해 회색 머리카락이 생겼으므로 누군가이 도움이되기를 바랍니다.


8

참고로 Angular 7.1.4 , TypeScript 3.1.6 을 사용하고 있으며이 행을 추가하는 것이 유일한 방법입니다 tsconfig.json.

    "types": ["node"], // within compilerOptions

그거 했어. 여전히이 오류가 발생했습니다 : '필수'이름을 찾을 수 없습니다. 노드에 대한 유형 정의를 설치해야합니까? 시도한 npm i @types/node다음 nodetsconfig의 유형 필드에 추가 하십시오. -npm을 설치했습니다.
스위스

7

해결책은 TSD 명령을 사용하는 것입니다.

tsd install node --save

어떤 typings/tsd.d.ts파일을 추가 / 업데이트 하고 해당 파일에는 노드 응용 프로그램에 필요한 모든 유형 정의가 포함됩니다.

내 파일 맨 위에 다음 tsd.d.ts과 같은 참조를 넣었습니다 .

/// <reference path="../typings/tsd.d.ts" />

2016 년 1 월 현재 요구 사항은 다음과 같이 정의됩니다.

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}

내가 찾을 수 없습니다 (404)를 가지고
bormat

5

Peter Varga의 대답 을 가져 와서 사전 프로세스 로더를declare var require: any; 사용하여 모든 .ts 파일에서 일반적으로 작동하는 일반 솔루션으로 만들었습니다 .

  1. 전 처리기 로더 설치 :

    npm install preprocessor-loader
  2. 로더를 webpack.config.js에 추가하십시오 ( TypeScript 소스를 처리하기 위해 ts-loader 를 사용하고 있습니다).

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. 모든 소스에 임시 해결책을 추가 할 구성을 추가하십시오.
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

같은 방식으로 더 강력한 require.d.ts를 추가 할 수 있지만 declare var require: any;제 상황에서는 충분했습니다.

참고 전처리 1.0.5의 버그있다 , 그래서 그냥 당신이 마지막에 여분의 줄 간격 반환이 있고 괜찮을거야하게 마지막 줄에 차단한다,.


1
이것이 왜 하향 조정 되었습니까? 그것은 질문에 대답하고 테이블에 새롭고 중요한 것을 가져옵니다. 이제 트랜스 파일러와 웹팩을 만족시키기 위해 모든 파일을 개별적으로 조작 할 필요가 없습니다.
베니 보 테마

3 단계를 더 설명해 주시겠습니까? 나는 새롭고이 구성 코드를 어디에 넣을 지 모른다.
user441058

@ user441058, GitHub 페이지를 확인하십시오 . 3 단계는 사전 프로세스 로더의 기본 구성에 대한 것입니다.
Benny Bottema

2

나는이 문제로 어려움을 겪고있다. 나는 이것이 모든 릴리스 후보 일명 rc에서 작동한다고 생각 하지만 테스트하지는 않았습니다. 들어 @angular rc.2 그것은 잘 작동합니다.

  1. core-jsnpm 종속성으로 추가package.json
  2. 운영 typings install core-js --save
  3. 의 모든 "es6-shim"발생을 제거 하십시오 package.json. 더 이상 필요하지 않습니다.

건배!


핵심 JS 유형은 무엇입니까? 특정 노드?
dcsan



2

때때로 tsconfig.json에서 "jasmine"이 누락되면이 오류가 발생할 수 있습니다. (TypeScript 2.X)

그래서 추가

"types": [
  "node",
  "jasmine"
]

당신에 tsconfig.json파일.


2

전자 + 각도 2/4 추가 :

ts.config에 'node'유형을 추가하는 것 외에도 다양한 파일이 결국에는 typings.d.ts파일 옆에 추가하는 것이 좋습니다 .

declare var window: Window;
interface Window {
  process: any;
  require: any;
}

필자의 경우 Electron + Angular 2/4로 개발 중입니다. 전 세계 창에 대한 요구가 필요했습니다.


2

나를 위해 각도 컴파일러 옵션에 유형 을 추가하여 해결되었습니다 .

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}

누구나 알고 싶어하는 tsconfig.json에 있습니다.
Stephen Zeng

1
이것은 각도 9입니다.
Arun

1
  1. 코드를 변환하는 데 사용할 모듈을 지정 했습니까?
    tsc --target es5 --module commonjs script.ts
    NodeJS 코드를 컴파일하고 있음을 트랜스 파일러에게 알리려면이를 수행해야합니다. 문서 .

  2. 몽구스 정의도 설치해야합니다
    tsd install mongoose --save

  3. var변수를 선언 하는 데 사용하지 마십시오 (필요한 경우가 아니라면 매우 드문 경우) let. 대신 사용하십시오. 그것에 대해 더 알아보기


1

TypeScript 1.x 의 경우 cgatian의 답변 외에도

여전히 오류가 표시되면 컴파일러 옵션에 index.d.ts를 구체적으로 제공하십시오.

"files": [
    "typings/index.d.ts"
]

1

위의 트릭을 사용하여 '필수'오류를 해결할 수 없었습니다.

그러나 문제는 Visual Studio 용 TypeScript 도구가 이전 버전 (1.8.6.0)과 최신 버전 (2.0.6.0) 인 것으로 나타났습니다.

다음 도구에서 최신 버전의 도구를 다운로드 할 수 있습니다.

Visual Studio 2015 용 TypeScript


1

당신이 코드를 컴파일 할 수 있지만 오류 텍스트 오류로 비주얼 스튜디오 2015 마크 기능을 '요구'하면 이름을 찾을 수 없습니다 '필요' 또는 수 없습니다 해결 기호 '필요' , 비주얼 스튜디오 2015 년 현재 2.1에서 최신 버전 (으로 업데이트 타이프 라이터. 5) ReSharper (사용하는 경우)를 2016.3.2 이상으로 업데이트하십시오.

나는이 성가신 문제를 잠시 동안 가지고 있었고 해결책을 찾을 수 없었지만 마침내이 방법으로 해결했습니다.


1

에 다음을 추가하십시오 tsconfig.json.

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

2
이것은 @ cgatian 's answer 에서 이미 언급되었습니다 .
tuomastik

@cgatian은 "node_modules / @ types"를 언급했지만 "../node_modules/@types"를 언급했습니다.
Darshan Ballal

1

npm install @types/node포함 node되어 있고를 포함하여 이전의 모든 답변을 바탕으로 한 또 다른 답변이 tsconfig.json / compilerOptions / types있습니다.

내 경우 tsConfig.json에는 Angular 응용 프로그램 에서이 것을 확장하는 별도 의 받침대가 있습니다 .

{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "outDir": "../out-tsc/app",
        "types": []
 },

내 문제는 이것에 비어 types있었습니다 tsconfi.app.json. 기본 구성의 문제를 막습니다.


-2

상수 값을 제공하기 위해 .ts 파일 에서이 문제에 직면 한 경우

.ts 파일의 이름을 .js 파일로 바꾸십시오

오류가 다시 발생하지 않습니다.

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