Błąd pobierania kodu TypeScript TS2304: nie można znaleźć nazwy „wymaga”

463

Usiłuję uruchomić moją pierwszą aplikację TypeScript i DefinatelyTyped Node.js i napotkałem pewne błędy.

Podczas próby transponowania prostej strony TypeScript Node.js pojawia się błąd „TS2304: Nie można znaleźć nazwy„ wymagają ””. Przeczytałem kilka innych wystąpień tego błędu w przepełnieniu stosu i nie sądzę, że mam podobne problemy. Uruchamiam w wierszu poleceń polecenie:

tsc movie.server.model.ts.

Zawartość tego pliku to:

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

Błąd jest generowany na var mongoose=require('mongoose')linii.

Zawartość pliku typings / tsd.d.ts to:

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

Odwołania do plików .d.ts zostały umieszczone w odpowiednich folderach i dodane do typings / tsd.d.ts za pomocą poleceń:

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

Wydany plik .js wydaje się działać dobrze, więc mogłem zignorować błąd. Byłbym wdzięczny, wiedząc, dlaczego ten błąd występuje i co robię źle.

JerryKur
źródło
1
when I attempt to transpile a simple ts node page<jak się transpilujesz ... które narzędzie
basarat
1
Właśnie uruchamiam w wierszu polecenia, wpisując polecenie: tsc movie.server.model.ts. FWIW to jest na komputerze Mac.
JerryKur,
1
Ten sam problem wystąpił również w IDE, którego używałem Visual Studio Code. Spróbuję to moje drugie IDE, IntelliJ. Zakładałem, że upuszczenie do wiersza poleceń było najczystszym sposobem przetestowania tego problemu.
JerryKur,
Jak o import { mongoose } from 'mongoose'?
FisNaN

Odpowiedzi:

744

Szybko i brudno

Jeśli używasz tylko jednego pliku, lub robisz to w celach demonstracyjnych, możesz zdefiniować wymaganie na górze pliku TypeScript.

declare var require: any

TypeScript 2.x

Jeśli używasz TypeScript 2.x, nie musisz już mieć zainstalowanych Typings lub Definitywnie Typed. Wystarczy zainstalować następujący pakiet.

npm install @types/node --save-dev

Przyszłość plików deklaracji (15.06.2016)

Narzędzia takie jak Typings i tsd będą nadal działać, a my będziemy współpracować z tymi społecznościami, aby zapewnić płynne przejście.

Sprawdź lub edytuj plik src /tsconfig.app.json, aby zawierał następujące elementy:

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

Upewnij się, że plik znajduje się w folderze src, a nie w folderze głównym aplikacji.

Domyślnie każdy pakiet poniżej @types jest już uwzględniony w twojej kompilacji, chyba że podasz jedną z tych opcji. Czytaj więcej

TypeScript 1.x

Używając typografii (zastąpienie DefinitelyTyped), możesz określić definicję bezpośrednio z repozytorium GitHub.

Zainstaluj pisma

npm install typings -g --save-dev

Zainstaluj definicję typu wymagaJS z repozytorium DefinitelyType

typings install dt~node --save --global

Webpack

Jeśli używasz pakietu Webpack jako narzędzia kompilacji, możesz uwzględnić typy pakietu Webpack.

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

Zaktualizuj swój tsconfig.jsonza pomocą następujących w compilerOptions:

"types": [
      "webpack-env"
    ]

Umożliwia to wykonywanie require.ensureinnych funkcji specyficznych dla pakietu Webpack.

Angular CLI

Dzięki CLI możesz wykonać powyższy krok pakietu Webpack i dodać blok „typów” do swojego tsconfig.app.json.

Alternatywnie możesz użyć wstępnie zainstalowanych nodetypów. Pamiętaj, że będzie to obejmować dodatkowe typy kodu po stronie klienta, które nie są tak naprawdę dostępne.

"compilerOptions": {
    // other options
    "types": [
      "node"
    ]
  }
Cgatian
źródło
4
dlaczego nie tylko „typings install --save --ambient wymagają”?
kutomer
1
dostaję błąd Unable to find "require" ("npm") in the registry. Czy wymaga części większego zestawu typów nodeJS?
dcsan
7
i tihnk jest to NIEPRAWIDŁOWE, ponieważ ma związek z typami wymaganymi, a nie wbudowanym węzłem require. być może jest to właściwa odpowiedź na niektóre warianty docelowego wyjścia ES5, ale nie na ogólny przypadek.
dcsan
1
Proszę odnieść się do Jordan Awnser. W moim przypadku zainstalowałem następujące typy @, więc dodałem -> „types”: [„node”, „es6-promise”, „core-js”, „jasmine”] <- do compilerOptions w tsconfig.json
Lothre1
1
@ Mewa @types/nodeto definicje TypeScript. Węzeł nie obejmuje ich, a także nie powinien.
cgatian
103

W przypadku TypeScript 2.x są teraz dwa kroki:

  1. Zainstaluj pakiet, który definiuje require. Na przykład:

    npm install @types/node --save-dev
  2. Powiedz TypeScript, aby umieścił go globalnie w tsconfig.json:

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

Drugi krok jest ważny tylko wtedy, gdy potrzebujesz dostępu do globalnie dostępnych funkcji, takich jak require. W przypadku większości pakietów powinieneś po prostu użyć import package from 'package'wzorca. Nie ma potrzeby dołączania każdego pakietu do powyższej tablicy typów tsconfig.json.

Jordania
źródło
1
Możesz użyć lib dla niektórych es5 github.com/Microsoft/TypeScript/wiki/… Eq: „lib”: [„dom”, „es5”, „es2015.promise”, „es2015.collection”]
Leo Caseiro
Po dodaniu "types": ["jasmine", "hammerjs"]do tsconfig.jsmuszę również dodać node. Dzięki Jordan.
Mikeumus,
Gdy zastosuję się do tej rady, spowoduje to przerwanie całego importu. Na przykład import express from "express";mówi mi teraz, że muszę spróbować zainstalować @ typy / express lub dodać dla niego plik .d.ts.
austinthemassive 10.10.17
4
Jeśli masz więcej @types/...niż tylko @types/nodefolder nie sumują "types": ["node"]się tsconfig.json, ponieważ maszynopis compiller będzie pomijać inne nie wymienione pakiety. Spowoduje to przerwanie rozwiązywania typów IDE. Jest napisane tutaj typescriptlang.org/docs/handbook/...
Marecky
To rozwiązanie działa dla mnie w projekcie jonowym bez problemów, dziękuję :)
Fran Sandi
71

Możesz

declare var require: any

Lub, aby uzyskać bardziej kompleksowe wsparcie, skorzystaj z pliku Def.dit

Zamiast tego var mongoose = require('mongoose')możesz wypróbować następujące

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')
ᆼ ᆺ ᆼ
źródło
1
Wystarczy użyć use strictw TypeScript: odpowiedź w formacie Basarat i „Use Strict” potrzebne w pliku TypeScript? . Konieczne jest użycie use strictw TypeScript.
Eugene Bichel
Hm, zgodnie z tą odpowiedzią nie jest konieczne, ale może być korzystne w użyciu "use strict",
zredaguję
użycie deklaruj var wymaga nie naprawia prawdziwego problemu; po prostu to ukrywam.
My Stack Overfloweth
@Właściwie, pamiętaj, że pochodzi z 2015 roku, a ponadto twierdzę, że nie ma „problemu” do naprawienia. TypeScript 2.0 rozwiązuje to teraz elegancko
5 ᆺ ᆼ
12

Ta odpowiedź dotyczy nowoczesnych konfiguracji (TypeScript 2.x, Webpack > 2.x)

Państwo nie trzeba instalować @ rodzai / węzeł (co jest wszystkich rodzajów node.js i nie ma znaczenia dla kodu front-end, faktycznie komplikowania rzeczy takie jak setTimout wartości różnią się w obie strony, etc ..

Ci zrobić konieczność instalowania @ typów / WebPack-ENV

npm i -D @types/webpack-env

co daje podpisy uruchomieniowe że WebPACK ma (w tym require, require.ensureetc.)

Upewnij się także, że plik tsconfig.json nie ma ustawionej tablicy „types” ->, dzięki czemu będzie pobierał wszystkie definicje typów w folderze node_modules / @ types.

Jeśli chcesz ograniczyć wyszukiwanie typów, możesz ustawić właściwość typeRoot na node_modules / @ types.

Nadav SInai
źródło
1
Jest to ważne spostrzeżenie również upewnić się, że tsconfig.json ma tablicę Nie ustalono „typów” -> co pozwoli pickup wszystkie definicje wpisać node_modules folderu / @ typy
Marecky
Czy są jakieś inne kroki potrzebne w podejściu webpack? Otrzymuję błąd kompilacji „błąd TS2580: Nie mogę znaleźć nazwy” wymagają ”.
jaycer
10

Zamiast:

'use strict';

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

Próbować:

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

'use strict';

tzn. najpierw ścieżka odniesienia.

Huragan
źródło
Działa, ale trochę brudne IMO - w zasadzie ukrywa błąd zamiast go poprawiać. Idealny do pokazów i szybkich skryptów, ale nie do produkcji
Nino Filiu
8

W moim przypadku był to bardzo głupi problem src/tsconfig.app.json przesłaniało to tsconfig.jsonustawienie.

Miałem to w tsconfig.json:

    "types": [
      "node"
    ]

A ten w src/tsconfig.app.json:

    "types": []

Mam nadzieję, że ktoś uzna to za pomocne, ponieważ ten błąd powodował u mnie siwe włosy.

h22a
źródło
8

Dla porównania używam Angular 7.1.4 , TypeScript 3.1.6 i jedyne, co muszę zrobić, to dodać tę linię tsconfig.json:

    "types": ["node"], // within compilerOptions
Hearen
źródło
Zrobił to. Nadal występuje ten błąd: nie można znaleźć nazwy „wymaga”. Czy musisz zainstalować definicje typów dla węzła? Spróbuj, npm i @types/nodea następnie dodaj nodedo pola typów w swoim tsconfig. - zainstalowałem npm.
Suisse
7

Odkryłem, że rozwiązaniem było użycie polecenia TSD:

tsd install node --save

Który dodaje / aktualizuje typings/tsd.d.tsplik, a ten plik zawiera wszystkie definicje typów wymagane dla aplikacji węzła.

W górnej części mojego pliku umieszczam odniesienie do tsd.d.tsnastępującego:

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

Wymaganie jest zdefiniowane w ten sposób od stycznia 2016 r .:

declare var require: NodeRequire;

interface NodeModule {
    exports: any;
    require: NodeRequireFunction;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];
}
AlexStack
źródło
Nie znaleziono 404
bormat
5

Wziąłem odpowiedź Petera Varga, aby dodać declare var require: any;i uczyniłem z niej ogólne rozwiązanie, które działa ogólnie dla wszystkich plików .ts przy użyciu modułu ładującego preprocess :

  1. zainstaluj moduł ładujący preprocesora:

    npm install preprocessor-loader
  2. dodaj moduł ładujący do pliku webpack.config.js (używam programu ts-loader do przetwarzania źródeł TypeScript):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Dodaj konfigurację, która doda obejście do każdego źródła:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

Możesz dodać bardziej wymagające wymagania.d.ts w ten sam sposób, ale declare var require: any;w mojej sytuacji było to wystarczające.

Uwaga: w preprocesorze 1.0.5 występuje błąd , który odcina ostatnią linię, więc upewnij się, że na końcu masz dodatkowy znak odstępu linii i wszystko będzie dobrze.

Benny Bottema
źródło
1
Dlaczego zostało to zanegowane? Odpowiada na pytanie i wnosi coś nowego i znaczącego do stołu. Teraz nie musisz zmieniać każdego pliku osobno, aby spełnić wymagania transpilatora i pakietu internetowego.
Benny Bottema
Czy możesz wyjaśnić krok 3 więcej? Jestem nowicjuszem i nie wiem, gdzie umieścić ten kod konfiguracji.
user441058,
@ user441058, sprawdź stronę GitHub , krok 3 dotyczy głównej konfiguracji modułu ładującego proces wstępny .
Benny Bottema,
2

Walczę również z tym problemem. Wierzę, że to działa na wszystkich kandydatów do wydania, czyli rc, ale nie testowałem. Dla @angular rc.2 działa dobrze.

  1. Dodaj core-js jako zależność npm wpackage.json
  2. biegać typings install core-js --save
  3. usuń wszystkie "es6-shim"wystąpienia w swoim package.json. Już tego nie potrzebujesz.

Twoje zdrowie!

kucherenkovova
źródło
do czego służą typy core-js? specyficzne dla węzła?
dcsan
2

Upewnij się, że masz zainstalowany npm i @types/node

Rupesh Kumar Tiwari
źródło
2

import * jako mongoose z „mongoose”

basquith16
źródło
2

Czasami brakuje „jaśminu” z tsconfig.json może powodować ten błąd. (TypeScript 2.X)

Więc dodaj

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

do twojego tsconfig.jsonpliku.

Samintha Kaveesh
źródło
2

Dodatek Electron + Angular 2/4:

Oprócz dodania typu „węzła” do różnych plików ts.config, ostatecznie zadziałało dla mnie dodanie następnego do typings.d.tspliku:

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

Zauważ, że mój przypadek rozwija się z Electron + Angular 2/4. Potrzebowałem wymagania globalnego okna.

mihaa123
źródło
2

Dla mnie jest to rozwiązane przez dodanie typów do opcji kompilatora kątowego.

"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true,
"types": [ "node" ]
}
Farida Anjum
źródło
Jest w tsconfig.json dla każdego, kto chce wiedzieć.
Stephen Zeng
1
dotyczy to kąta 9.
Arun
1
  1. Czy określiłeś, którego modułu użyć do transponowania kodu?
    tsc --target es5 --module commonjs script.ts
    Musisz to zrobić, aby poinformować transpiler, że kompilujesz kod NodeJS. Docs .

  2. Musisz także zainstalować definicje mangusty
    tsd install mongoose --save

  3. Nie używaj vardo deklarowania zmiennych (chyba że jest to konieczne, co jest bardzo rzadkim przypadkiem), użyj letzamiast tego. Dowiedz się więcej na ten temat

Ayman Nedjmeddine
źródło
1

Oprócz odpowiedzi cgatian, dla TypeScript 1.x

Jeśli nadal widzisz błędy, podaj indeks.d.ts w opcjach kompilatora.

"files": [
    "typings/index.d.ts"
]
Vidish Datta
źródło
1

Nie mogłem dostać błędu „wymagaj”, aby odejść, używając jednej z powyższych sztuczek.

Ale odkryłem, że problem polegał na tym, że moje narzędzia TypeScript do Visual Studio, w których jest stara wersja (1.8.6.0) i najnowsza wersja na dzień dzisiejszy (2.0.6.0).

Możesz pobrać najnowszą wersję narzędzi z:

TypeScript for Visual Studio 2015

Tomasz
źródło
1

Jeśli możesz skompilować kod, ale znaki Visual Studio 2015 „wymagają” działają, ponieważ błędy z tekstem błędu nie mogą znaleźć nazwy „wymagają” lub nie mogą rozwiązać symbolu „wymagają” , zaktualizuj TypeScript dla Visual Studio 2015 do najnowszej wersji (w tej chwili 2.1. 5) i zaktualizuj ReSharper (jeśli go używasz) co najmniej do wersji 2016.3.2.

Przez jakiś czas miałem ten irytujący problem i nie mogłem znaleźć rozwiązania, ale w końcu rozwiązałem go w ten sposób.

Mike Eshva
źródło
1

Dodaj następujące elementy tsconfig.json:

"typeRoots": [ "../node_modules/@types" ]
Darshan Ballal
źródło
2
Jak już wspomniano w @ cgatian za odpowiedź .
tuomastik
@cgatian wspomniał o „node_modules / @ types”, a ja o „../node_modules/@types”.
Darshan Ballal
1

Mam jeszcze jedną odpowiedź, która opiera się na wszystkich poprzednich, które opisują npm install @types/nodei włączając nodew tsconfig.json / compilerOptions / types.

W moim przypadku mam podstawową tsConfig.jsoni osobną w aplikacji Angular, która rozszerza tę:

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

Mój problem polegał na typestym, że jest pusty tsconfi.app.json- blokuje ten w konfiguracji podstawowej.

HankCa
źródło
-2

Jeśli masz do czynienia z tym problemem w pliku .ts, który jest tylko po to, aby zapewnić ci stałe wartości, możesz po prostu

zmień nazwę pliku .ts na .js

i błąd nie pojawi się ponownie.

Aavgeen singh
źródło