Vraag typencript krijgt fout TS2304: kan naam niet vinden 'vereisen'


Ik probeer mijn eerste Typescript en DefinitelyTyped node app in gebruik te krijgen en enkele fouten tegen te komen.

Ik krijg de foutmelding "TS2304: Can not find name 'require'" wanneer ik probeer een eenvoudige ts knooppuntpagina te transponeren. Ik heb verschillende andere exemplaren van deze fout op SO gelezen en ik denk niet dat ik soortgelijke problemen heb.
Ik voer de shell prompt uit met de opdracht: tsc movie.server.model.ts. De inhoud van dit bestand is:

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

De fout wordt gegooid op de var mongoose = require ('mongoose') regel

De inhoud van het bestand typings / tsd.d.ts is:

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

De verwijzingen naar het .d.ts-bestand zijn in de juiste mappen geplaatst en aan de typen / tsd.d.ts toegevoegd door de opdrachten:

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

Het geproduceerde .js-bestand lijkt goed te werken, dus ik kon de fout negeren. Maar ik zou het waarderen als ik weet waarom deze fout optreedt en wat ik verkeerd doe.


294
2017-07-02 00:21


oorsprong


antwoorden:


Snel en vies

Als u slechts één bestand nodig hebt, of als u dit voor demotoepassingen doet, kunt u aan de bovenkant van uw TypeScript-bestand de vereisten definiëren.

declare var require: any

TypeScript 2.x

Als u TypeScript 2.x gebruikt, hoeft u typeren of definitief typen niet meer te installeren. Installeer gewoon het volgende pakket.

npm install @types/node --save-dev

De toekomst van de declaratiebestanden (6/15/2016)

Tools zoals Typings en tsd zullen blijven werken en we zullen werken   naast die communities om een ​​soepele overgang te garanderen.

OPTIONEEL: Als u opgeeft typeroots of types in uw tsconfig.json. Mogelijk moet u het bijwerken tsconfig.json om het knooppunt als een type op te nemen. Standaard is elk pakket onder @types al opgenomen in je build tenzij je hebt een van deze opties opgegeven. Lees verder 

Hieronder vindt u de juiste configuratie voor elk van deze opties.

{
    "compilerOptions": {
        // types option has been previously configured
         "types": [
            // add node as an option
            "node"
         ],
         // typeRoots option has been previously configured
         "typeRoots": [
            // add path to @types
            "node_modules/@types"
         ]
    }
}

TypeScript 1.x

Met behulp van typings (de vervanging van DefinitelyTyped) kun je een definitie direct vanuit een GitHub-repository specificeren.

Typ typings

npm install typings -g --save-dev

Installeer de requireJS-typedefinitie uit de repository van DefinitelyType

typings install dt~node --save --global

webpack

Als u Webpack als uw bouwtool gebruikt, kunt u de Webpack-typen opnemen.

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

Update uw tsconfig.json met het volgende onder compilerOptions:

"types": [
      "webpack-env"
    ]

Dit staat je toe om te doen require.ensure en andere specifieke functies van Webpack.

Hoekige CLI

Met CLI kunt u de stap Webpack hierboven volgen en het blok 'typen' toevoegen aan uw tsconfig.app.json.

U kunt ook de vooraf geïnstalleerde versie gebruiken node soorten. Houd er rekening mee dat dit extra typen aan uw client-side code zal bevatten die niet echt beschikbaar zijn.

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

459
2018-03-12 17:46



Voor TypeScript 2.x, er zijn nu twee stappen:

  1. Installeer een pakket dat definieert require. Bijvoorbeeld:

    npm install @types/node --save-dev
    
  2. Vertel TypeScript om het wereldwijd op te nemen tsconfig.json:

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

De tweede stap is alleen belangrijk als u toegang nodig hebt tot wereldwijd beschikbare functies zoals require. Voor de meeste pakketten, moet u gewoon de import package from 'package'patroon. Het is niet nodig om elk pakket in de tsconfig.json -typearray hierboven op te nemen.


69
2017-09-08 22:42



Jij kan

declare var require: any

Of gebruik voor meer uitgebreide ondersteuning DefinitelyTyped's require.d.ts

Ook in plaats van var mongoose = require('mongoose'), je zou het volgende kunnen proberen

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

58
2017-07-07 08:26



In plaats van:

'use strict';

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

Proberen:

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

'use strict';

d.w.z. het referentiepad eerst.


9
2018-01-04 16:52



Ik vond de oplossing om de TSD-opdracht te gebruiken:

tsd install node --save

Welke de / toevoegt / update typings/tsd.d.ts bestand en dat bestand bevat alle typedefinities die vereist zijn voor een knooppunttoepassing.

Aan de bovenkant van mijn bestand heb ik een verwijzing naar de tsd.d.ts soortgelijk:

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

De vereisten worden als volgt gedefinieerd vanaf januari 2016:

declare var require: NodeRequire;

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

7
2018-01-25 14:38



ik nam Peter Varga's antwoord toevoegen declare var require: any; en maakte het een generieke oplossing die voor alle .ts-bestanden generiek werkt door de .ts-bestanden te gebruiken preprocess-loader:

  1. installeer preprocessor-loader:

    npm install preprocessor-loader
    
  2. voeg de loader toe aan jouw webpack.config.js (Ik gebruik ts-loader voor het verwerken van TypeScript-bronnen):

    module: {
        loaders: [{
            test: /\.tsx?$/,
            loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json'
        }]
    }
  1. Voeg de configuratie toe die de tijdelijke oplossing toevoegt aan elke bron:
{
    "line": false,
    "file": true,
    "callbacks": [{
        "fileName": "all",
        "scope": "source",
        "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })"
    }]
}

U kunt des te robuuster toevoegen require.d.ts op dezelfde manier, maar declare var require: any; was voldoende in mijn situatie.

Notitie, er is een fout in preprocessor 1.0.5, die de laatste regel afsnijdt, dus zorg ervoor dat u aan het einde een extra regelafstandsterugkeer hebt en u komt wel goed.


4
2018-02-18 13:27



Dit antwoord heeft betrekking op moderne setups (typescript 2.x, webpack> 2.x)

u hoeft geen @ types / node te installeren (dit is allemaal van de node.js-types en is niet relevant voor de front-end code, waardoor het zelfs complicaties oplevert zoals setTimout verschillende retourwaarden, enz.

je moet @ types / webpack-env installeren

npm i -D @types/webpack-env

die de runtime-handtekeningen geeft die webpack heeft (inclusief vereisten en vereiste.ensuur, enz.)

Zorg er ook voor dat uw tsconfig.json geen 'array' -typen heeft -> waardoor alle typedefinities in uw map node_modules / @ types worden opgehaald. als u zoeken naar typen wilt beperken, kunt u de eigenschap typeRoot instellen op node_modules / @ types


4
2018-03-15 12:12



Soms mist "jasmine" van tsconfig.json deze fout. (Typescript 2.X)

dus voeg toe

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

naar je tsconfig.json


1
2018-04-07 08:04



Electron + hoekige 2/4 toevoeging: Bovenop het toevoegen van 'node' type aan ts.config verschillende bestanden, wat uiteindelijk voor mij werkte is het toevoegen van de volgende typings.d.ts bestand:

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

Merk op dat mijn zaak zich ontwikkelt met electron + hoekig 2/4. Ik had de vereisten in het venster globaal nodig.


1
2017-11-18 10:10



Ik heb ook moeite met dit probleem. Ik geloof dat dit voor iedereen werkt kandidaten vrijgeven aka rc maar ik heb het niet getest. Voor @angular rc.2 het werkt goed.

  1. Toevoegen core-js als npm-afhankelijkheid in package.json
  2. rennen typings install core-js --save
  3. Verwijder alles "es6-shim" voorvallen in uw package.json. Je hebt het niet meer nodig.

Proost!


0
2018-06-21 12:26



  1. Hebt u aangegeven welke module moet worden gebruikt om de code te transponeren?
    tsc --target es5 --module commonjs script.ts
    U moet dat doen om de transponder te laten weten dat u de NodeJS-code compileert. Docs.

  2. Je moet ook mongozedefinities installeren
    tsd install mongoose --save

  3. Gebruik niet var om variabelen te declareren (tenzij nodig, wat een zeer zeldzaam geval is), gebruik let in plaats daarvan. Lees hier meer over


0
2017-07-19 08:59