TypeScript TS2304 hatası alıyor: 'gerektiren' adı bulunamıyor


463

İlk TypeScript ve DefinitelyTyped Node.js uygulamasını çalışır duruma getirmeye çalışıyorum ve bazı hatalarla karşılaşıyorum.

Basit bir TypeScript Node.js sayfasını aktarmaya çalıştığımda "TS2304: 'requir' adı bulunamıyor 'hatasını alıyorum. Stack Overflow bu hatayı birkaç kez daha okudum ve ben benzer sorunları olduğunu sanmıyorum. Kabuk komut isteminde şu komutu çalıştırıyorum:

tsc movie.server.model.ts.

Bu dosyanın içeriği:

'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';

Hata var mongoose=require('mongoose')hatta atılır .

Typings / tsd.d.ts dosyasının içeriği:

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

.D.ts dosya başvuruları uygun klasörlere yerleştirildi ve / tsd.d.ts komutlarına aşağıdaki komutlarla eklendi:

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

Üretilen .js dosyası iyi çalışıyor gibi görünüyor, bu yüzden hatayı yok sayabilirim. Ama bu hatanın neden oluştuğunu ve yanlış yaptığımı bilmekten memnun olurum.


1
when I attempt to transpile a simple ts node page<nasıl naklediyorsun ... hangi yardımcı program
basarat

1
Ben sadece komut satırında şu komutu yazarak çalışıyorum: tsc movie.server.model.ts. FWIW bu bir Mac bilgisayarında.
JerryKur

1
Aynı sorun, Visual Studio Code kullandığım IDE de oluştu. Diğer IDE'im IntelliJ'i deneyeceğim. Komut satırına düşmenin bu sorunu test etmenin en temiz yolu olduğunu varsaydım.
JerryKur


Nasıl import { mongoose } from 'mongoose'?
FisNaN

Yanıtlar:


744

Hızlı ve kirli

Require kullanarak yalnızca bir dosyanız varsa veya bunu demo amacıyla yapıyorsanız, TypeScript dosyanızın üst kısmında Require'ı tanımlayabilirsiniz.

declare var require: any

TypeScript 2.x

TypeScript 2.x kullanıyorsanız, artık Türler veya Kesinlikle Yazılmış olması gerekmez. Aşağıdaki paketi kurmanız yeterlidir.

npm install @types/node --save-dev

Beyan Dosyalarının Geleceği (15.06.2016)

Typings ve tsd gibi araçlar çalışmaya devam edecek ve sorunsuz bir geçiş sağlamak için bu topluluklarla birlikte çalışacağız.

Src /tsconfig.app.json'unuzu aşağıdakileri içerecek şekilde doğrulayın veya düzenleyin:

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

Src klasöründeki dosyanın ve kök uygulama klasöründeki dosyanın olmadığından emin olun .

Varsayılan olarak, @types altında herhangi bir paket zaten Yapınızda dahildir sürece sen bu seçeneklerden birini belirttiğiniz. Daha fazla oku

TypeScript 1.x

Yazı tiplerini kullanarak (DefinitelyTyped'in yerine) doğrudan bir GitHub deposundan bir tanım belirleyebilirsiniz.

Yazıları yükle

npm install typings -g --save-dev

DefinitelyType'ın deposundan requirJS türü tanımını yükleyin

typings install dt~node --save --global

webpack

Derleme aracı olarak Webpack'i kullanıyorsanız, Webpack türlerini dahil edebilirsiniz.

npm install - kaydetme dev @ türler / webpack-env

tsconfig.jsonAşağıdakileri aşağıdakilerle güncelleyin compilerOptions:

"types": [
      "webpack-env"
    ]

Bu, require.ensureWeb Paketine özgü diğer işlevleri yapmanızı sağlar .

Açısal CLI

CLI ile yukarıdaki Webpack adımını izleyebilir ve "types" bloğunu bilgisayarınıza ekleyebilirsiniz tsconfig.app.json.

Alternatif olarak, önceden kurulu nodetürleri kullanabilirsiniz . Bunun, istemci tarafı kodunuza gerçekte ulaşılamayan ek türleri içereceğini unutmayın.

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

4
neden sadece "daktilolar install --save --ambient gerektirir"?
Kutomer

1
bununla ilgili bir hata alıyorum Unable to find "require" ("npm") in the registry. Gereksinim daha büyük bir nodeJS yazımları grubunun parçası mı?
dcsan

7
i tihnk bu YANLIŞ onun düğüm için değil, istekJS için yazımları ile ilgili olarak require. belki ES5 çıktı hedefinin bazı varyasyonları için doğru cevabı, ancak genel durum değil.
dcsan

1
Lütfen Jordan Awnser'a bakınız. Benim durumumda şu @types yükledim, bu yüzden ekledim -> "türleri": ["düğüm", "es6-promise", "core-js", "yasemin"] <- tsconfig.json'daki compilerOptions'a
Lothre1

1
@Seagull @types/node, TypeScript tanımlarıdır. Düğüm bunları içermez ve içermemelidir.
cgatian

104

TypeScript 2.x için artık iki adım var:

  1. Tanımlayan bir paket kurun require. Örneğin:

    npm install @types/node --save-dev
  2. TypeScript'e global olarak dahil etmesini söyleyin tsconfig.json:

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

İkinci adım yalnızca, gibi global olarak kullanılabilir işlevlere erişmeniz gerektiğinde önemlidir require. Çoğu paket için sadece import package from 'package'deseni kullanmalısınız . Yukarıdaki tsconfig.json types dizisine her paketi dahil etmeye gerek yoktur.


1
Lib'i bazı es5 github.com/Microsoft/TypeScript/wiki/… için kullanabilirsiniz. Denk: "lib": ["dom", "es5", "es2015.promise", "es2015.collection"]
Leo Caseiro

Ekledikten sonra "types": ["jasmine", "hammerjs"]için tsconfig.jsben eklemek hade nodekuyu olarak. Teşekkürler Jordan.
Mikeumus

Bu tavsiyeye uyduğumda, tüm ithalatlarımı kırar. Örneğin import express from "express";, şimdi @ tür / express yüklemeyi denemem gerektiğini veya bunun için bir .d.ts dosyası eklemem gerektiğini söylüyor.
austinthemassive

4
Daha varsa @types/...daha adil @types/nodeklasör katmayan "types": ["node"]içinde tsconfig.jsontypescript compiller diğer değil bahsedilen paketleri ihmal çünkü. Bu, IDE türlerinin çözümlenmesini bozacaktır. Burada yazılmıştır typescriptlang.org/docs/handbook/…
Marecky

Bu çözüm benim için problemsiz bir iyonik projede çalışıyor, teşekkür ederim :)
Fran Sandi

71

Yapabilirsin

declare var require: any

Veya daha kapsamlı destek için DefinitelyTyped'in requir.d.ts dosyasını kullanın

Ayrıca, var mongoose = require('mongoose')aşağıdakileri deneyebilirsiniz

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

1
use strictTypeScript'te kullanmakla ilgili : basarat yanıtı ve bir TypeScript dosyasında “Kesin Kullan” gerekli mi? . use strictTypeScript'te kullanmak gerekir.
Eugene Bichel

Hm, bu cevaba göre gerekli değil, ancak yararlı olabilir "use strict", cevabımı düzenleyeceğim
ᆼ ᆺ ᆼ

deklare var gerektiren kullanmak gerçek sorunu çözmüyor; sadece saklıyorum.
Benim Yığın Overfloweth

@ Doğru değil, bunun 2015'ten olduğunu unutmayın ve ayrıca, düzeltilecek bir "sorun" olmadığını iddia ediyorum. TypeScript 2.0 şimdi bunu zarif bir şekilde çözüyor
ᆼ ᆺ ᆼ

12

Bu cevap modern kurulumlarla ilgilidir (TypeScript 2.x, Webpack > 2.x)

Sen yok yüklemeniz gerekir @ node.js türleri ve ön uç kodu için önemsizdir türleri / düğümü (aslında durumu karıştırma vb setTimout farklı dönüş değerleri olarak ..

Sen yapmak türlerine @ yüklemeye gerek / webpack-env

npm i -D @types/webpack-env

hangi WebPack (dahil olduğu çalışma zamanı imzaları verir require, require.ensurevb)

Ayrıca tsconfig.json dosyanızın node_modules / @ types klasörünüzdeki tüm tür tanımlarını almasını sağlayacak bir 'türler' dizisi -> olmadığından emin olun.

Tür aramasını kısıtlamak istiyorsanız, typeRoot özelliğini node_modules / @ türlerine ayarlayabilirsiniz.


1
bu da önemli bir nokta , tsconfig.json'unuzun node_modules / @ types klasörünüzdeki tüm tip tanımlarını almasını sağlayacak bir 'türler' dizisi -> olmadığından emin olun
Marecky

Webpack yaklaşımıyla ilgili başka adımlar gerekiyor mu? Derleme hatası alıyorum `hata TS2580: 'Gereksinim' adı bulunamıyor.
jaycer

10

Onun yerine:

'use strict';

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

Deneyin:

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

'use strict';

yani önce referans yolu.


Çalışır, ancak kirli IMO - temelde hatayı düzeltmek yerine gizler. Demolar ve hızlı senaryolar için mükemmel, ancak prodüksiyon için değil
Nino Filiu

8

Benim durumumda, bu ayarı src/tsconfig.app.jsongeçersiz kılan süper aptalca bir sorundu tsconfig.json.

Yani, ben vardı tsconfig.json:

    "types": [
      "node"
    ]

Ve bu da src/tsconfig.app.json:

    "types": []

Umarım birisi bunu yararlı bulur, çünkü bu hata bana gri tüylere neden oluyordu.


8

Sadece referans için, Açısal 7.1.4 , TypeScript 3.1.6 kullanıyorum ve yapmam gereken tek şey bu satırı eklemektir tsconfig.json:

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

yaptım. Hâlâ bu hata var: 'Require' adı bulunamıyor. Düğüm için tür tanımlarını yüklemeniz mi gerekiyor? Deneyin npm i @types/nodeve nodetsconfig dosyanızdaki türler alanına ekleyin . - npm kurdu.
Suisse

7

Çözümün TSD komutunu kullanmak olduğunu buldum:

tsd install node --save

Hangi ekler / günceller typings/tsd.d.ts dosya ve bu dosya bir düğüm uygulaması için gereken tüm tür tanımlarını içerir.

Dosyamın en üstünde, buna benzer bir referans koydum tsd.d.ts:

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

Gereksinim Ocak 2016 itibariyle şu şekilde tanımlanmıştır:

declare var require: NodeRequire;

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

404 bulunamadı
bormat

5

Peter Varga'nın eklemek için cevabını aldım declare var require: any;ve önişleme yükleyicisini kullanarak tüm .ts dosyaları için genel olarak çalışan genel bir çözüm haline getirdim :

  1. önişlemci-yükleyiciyi kurun:

    npm install preprocessor-loader
  2. yükleyiciyi webpack.config.js dosyasına ekleyin ( TypeScript kaynaklarını işlemek için ts-loader kullanıyorum ):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Geçici çözümü her kaynağa ekleyecek yapılandırmayı ekleyin:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Daha sağlam bir gereksinim ekleyebilirsiniz. Dts aynı şekilde,declare var require: any; benim durumumda yeterliydi.

Önişlemci 1.0.5'te son satırı kesen bir hata olduğunu unutmayın, bu yüzden sonunda fazladan bir satır boşluğuna sahip olduğunuzdan emin olun ve iyi olacaksınız.


1
Bu neden reddedildi? Soruyu cevaplar ve masaya yeni ve önemli bir şey getirir. Artık, transpiler ve web paketini tatmin etmek için her dosyayı tek tek değiştirmek zorunda değilsiniz.
Benny Bottema

3. adımı daha açıklayabilir misiniz? Ben yeniyim ve bu yapılandırma kodunu nereye koyacağımı bilmiyorum.
user441058

@ user441058, GitHub sayfasına bakın , 3. adım önişlemci için ana yapılandırma hakkındadır.
Benny Bottema

2

Ben de bu konuda mücadele ediyorum. Bunun herkes için işler olduğuna inanıyoruz sürüm adayları aka rc ama testi vermedi olsa. İçin @angular rc.2 iyi çalışıyor.

  1. core-jsİçinde npm bağımlılığı olarak eklepackage.json
  2. Çalıştırmak typings install core-js --save
  3. içindeki tüm "es6-shim"olayları kaldırın package.json. Artýk buna ihtiyacýn yok.

Şerefe!


core-js yazmaları ne için? düğüme özgü?
dcsan



2

Tsconfig.json dosyasında "jasmine" eksik bazen bu hataya neden olabilir. (TypeScript 2.X)

Yani ekle

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

tsconfig.jsondosyasına ekleyin .


2

Elektron + Açısal 2/4 ekleme:

'Düğüm' türünü ts.config dosyasına çeşitli dosyalara eklemenin yanı sıra, sonunda benim için işe yarayan şey dosyanın yanını eklemektir typings.d.ts:

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

Benim durumumun Electron + Angular 2/4 ile geliştiğini unutmayın. Küresel pencerede gereksinim duydum.


2

Benim için açısal derleyici seçeneklerine türler eklenerek çözüldü .

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

Herkes bilmek istiyor tstsfig.json içinde.
Stephen Zeng

1
bu açısal 9 içindir.
Arun

1
  1. Kodu aktarmak için hangi modülü kullanacağınızı belirttiniz mi?
    tsc --target es5 --module commonjs script.ts
    Transpiler NodeJS kodunu derlediğinizi bildirmek için bunu yapmanız gerekir. Dokümanlar .

  2. Firavun faresi tanımlarını da yüklemelisiniz
    tsd install mongoose --save

  3. varDeğişkenleri bildirmek için kullanmayın (gerekli değilse, çok nadir bir durumdur), letyerine kullanın. Bununla ilgili daha fazla bilgi edinin


1

Cgatian'ın cevabına ek olarak, TypeScript 1.x için

Hala hata görüyorsanız, lütfen derleyici seçeneklerinizde index.d.ts dosyasını belirtin.

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

1

Yukarıdaki hileler kullanarak uzaklaşmak için 'gerektiren' hata alamadım.

Ancak sorunun eski sürümün (1.8.6.0) ve bugünün son sürümünün (2.0.6.0) olduğu Visual Studio için TypeScript araçlarım olduğunu öğrendim.

Araçların en son sürümünü şu adresten indirebilirsiniz:

Visual Studio 2015 için TypeScript


1

Kod derleyebiliyor ancak Visual Studio 2015, 'zorunlu' işlevlerini hata metnindeki hatalar 'zorunlu' adını bulamıyor veya 'zorunlu' sembolünü çözemediğinden işaretliyorsa çözemiyorsa, Visual Studio 2015 için TypeScript'i en son sürüme güncelleyin (şu anda 2.1. 5) ve ReSharper'ı (kullanıyorsanız) en az 2016.3.2 sürümüne güncelleyin.

Bir süre bu sinir bozucu sorunum vardı ve bir çözüm bulamadım, ama sonunda bu şekilde çözdüm.


1

Aşağıdakileri şuraya ekleyin tsconfig.json:

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

2
Bu zaten @ cgatian en açıklanan cevap .
tuomastik

@cgatian "../node_modules/@types" den bahsetmişken "node_modules / @ types" dan bahsetmiştir.
Darshan Ballal

1

Daha önce açıklayan npm install @types/nodeve dahil nodeolan tüm cevaplar üzerine kurulu başka bir cevap daha var tsconfig.json / compilerOptions / types.

Benim durumumda, tsConfig.jsonaçısal uygulamada bunu genişleten bir taban ve ayrı bir tane var:

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

Benim sorunum bu boştu types- bu tsconfi.app.jsontemel yapılandırma bir clobbers.


-2

Bu sorunla yalnızca bazı sabit değerler sağlamak için var olan bir .ts dosyasında karşılaşıyorsanız,

.ts dosyanızı .js dosyasına yeniden adlandırın

ve hata tekrar gelmeyecek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.