nodejs requiere dentro del archivo TypeScript

97

¿Cómo cargo un módulo NodeJS normal (desde node_modules) desde dentro de una TypeScriptclase?

Cuando intento compilar un .tsarchivo que contiene:

var sampleModule = require('modulename');

Los mensajes del compilador que no puedo usar requieren en este ámbito. (esa línea está al principio del archivo).

Zdenek Sejcek
fuente
1
¿Puedes mostrarnos tu código (original y compilado)? Pensé que requirese puede usar en cualquier lugar, no depende del alcance.
raro
Sí, pero debe ser declarado y no está declarado en lib.d.ts predeterminado como sugirió Valentin.
Zdenek Sejcek

Respuestas:

105

Mecanografiado siempre se quejará cuando no pueda encontrar un símbolo. El compilador viene junto con un conjunto de definiciones predeterminadas para window, documenty como se especifican en un archivo llamado lib.d.ts. Si hago un grep requireen este archivo, no puedo encontrar una definición de función require. Por lo tanto, tenemos que decirle al compilador que esta función existirá en tiempo de ejecución usando la declaresintaxis:

declare function require(name:string);
var sampleModule = require('modulename');

En mi sistema, esto se compila bien.

Valentin
fuente
23
Gracias. Esto funcionará para todas las funciones no declaradas. La mejor solución que he encontrado es obtener node.d.ts de muestras mecanografiadas y hacer referencia a él. De lo que tienes todo. También hay express.d.ts.
Zdenek Sejcek
2
Creo que tú también puedes hacerloimport sampleModule = module('modulename')
mpen
Sí, pero node.d.ts está actualmente en v0.8.8. Es mejor usar el enfoque de @Valentin y luego usar, por ejemplo, WebStorm IDE que puede descargar definiciones para la versión de Node que está ejecutando y darle autocompletar, etc.
Radek
@Radek ¿Cómo haces eso? Utilizo WebStorm 7.0.2 (más reciente) Por cierto, no encuentro el script node.d.ts, ¿dónde se encuentra? Gracias.
Vadorequest
1
@Vadorequest esto debería ayudar: jetbrains.com/webstorm/webhelp/…
Radek
61

La sintaxis correcta es:

import sampleModule = require('modulename');

o

import * as sampleModule from 'modulename';

Luego compile su TypeScript con --module commonjs.

Si el paquete no viene con un index.d.tsarchivo y package.jsonno tiene una "typings"propiedad, tscladrará que no sabe a qué se 'modulename'refiere. Para ello, necesita encontrar un .d.tsarchivo en http://definitelytyped.org/ o escribir uno usted mismo.

Si está escribiendo código para Node.js, también querrá el node.d.tsarchivo de http://definitelytyped.org/ .

Jesse
fuente
Seguí este enfoque, usando "import * as $ s from 'scriptjs';" ya que estoy usando TypeScript. El comando CKEDITOR.replace () parece ejecutarse, y obtengo lo que parece un elemento DOM válido, sin embargo, nada cambia en el navegador (sigue siendo un área de texto) y mi editor.on ('contentDom', ...) devoluciones de llamada (también instalado dentro de la devolución de llamada $ s) nunca se llama. ¿Alguna idea de lo que pasa?
Vern Jensen
43

La mejor solución es obtener una copia de las definiciones de tipos de Node. Esto resolverá todo tipo de problemas de dependencia, no solo require(). Esto se hacía anteriormente usando paquetes como typings, pero como mencionó Mike Chamberlain, Typings está en desuso. La forma moderna lo está haciendo así:

npm install --save-dev @types/node

No solo solucionará el error del compilador, sino que también agregará las definiciones de la API de nodo a su IDE.

rharriso
fuente
1
¡Esto funcionó para mí también! Pero lo que no entiendo es que lo tenía instalado globalmente (es decir:) npm install -g @types/nodepero eso no funcionó.
Jeach
¿Qué pasa si el módulo de tipos no está disponible en npm?
Sudharshan Nair
@SudharshanNair hay muchos tipos definidos por el proyecto DefinitelyTyped. Otras opciones incluyen contribuir a declarar tipos Definitivamente tipados dentro de su propio proyecto, o usar sin defs de tipo,
rharriso
3

Use mecanografía para acceder a las funciones de nodo desde TypeScript:

typings install env~node --global

Si no tiene mecanografía 😲 instálelo:

npm install typings --global
Oded Breiner
fuente
20
Cabe señalar que la mecanografía está en desuso a favor de simplementenpm install @types/node --save-dev
Mike Chamberlain