¿Cómo importar el módulo de nodo en Typescript sin definiciones de tipo?

Cuando bash importar el módulo node.js en Typescript como este:

import co = require('co'); import co from 'co'; 

sin proporcionar definiciones de tipo, ambas líneas informan del mismo error:

 error TS2307: Cannot find module 'co'. 

¿Cómo importarlo correctamente?

Sus opciones son importarlo fuera del sistema de módulos de TypeScript (llamando a la API de un módulo como RequireJS o Node directamente a mano) para que no intente validarlo, o agregar una definición de tipo para que pueda usar el sistema de módulos y tenerlo validado correctamente. Sin embargo, puede eliminar la definición de tipo, por lo que puede ser un esfuerzo muy bajo.

Usando las importaciones de Nodo (CommonJS) directamente:

 // Note there's no 'import' statement here. var loadedModule: any = require('module-name'); // Now use your module however you'd like. 

Usando RequireJS directamente:

 define(["module-name"], function (loadedModule: any) { // Use loadedModule however you'd like }); 

Tenga en cuenta que en cualquiera de estos casos, esto puede combinarse de forma extraña con el uso de importaciones de módulos TypeScript normales en el mismo archivo (puede terminar con dos capas de definición de módulos, especialmente en el lado RequireJS, ya que TypeScript intenta administrar los módulos en los que está También gestionando a mano). Recomiendo usar solo este enfoque o usar definiciones de tipo real.

Definiciones de tipos de stubbing:

Sería mejor obtener las definiciones de tipo adecuadas, y si están disponibles o si tiene tiempo para escribirlas usted mismo, definitivamente debería hacerlo.

Sin embargo, si no es así, puedes darle a tu módulo completo el tipo que sea necesario y colocarlo en el sistema de módulos sin tener que escribirlo:

 declare module 'module-name' { export =  {}; } 

Esto debería permitirle importar module-name y hacer que TypeScript sepa de qué está hablando. Aún tendrá que asegurarse de que la importación del nombre del módulo realmente lo cargue con éxito en el tiempo de ejecución con cualquier sistema de módulos que esté utilizando, o se comstackrá pero luego no se ejecutará.

El truco es usar la notación puramente de JavaScript:

 const co = require('co'); 

Obtuve un error cuando utilicé el enfoque de “definiciones de tipo de apéndice” en la respuesta de Tim Perry: error TS2497: Module ''module-name'' resolves to a non-module entity and cannot be imported using this construct.

La solución fue rehacer el archivo stub .d.ts ligeramente:

 declare module 'module-name' { const x: any; export = x; } 

Y luego puedes importar a través de:

 import * as moduleName from 'module-name'; 

La creación de su propio archivo de resguardo reduce la barrera para escribir declaraciones reales a medida que las necesite.