Búsqueda de sitios web

javascript - El módulo no tiene exportación por defecto después de convertir a Typescript


He convertido el código de JavaScript a TypeScript y estoy obteniendo el error

El módulo no tiene exportación por defecto

He intentado importar usando las llaves y exportar usando module.exports, pero ninguno de ellos funcionó.

contactController.ts

const contacts: String[] = [];

// Handle index actions
exports.index = (req: any, res: any) => {
    res.json({
        data: contacts,
        message: "Contacts retrieved successfully",
        status: "success"
    });
};

// Handle create contact actions
exports.new = (req: any, res: any) => {

     // save the contact and check for errors
    contacts.push("Pyramids");

    res.json({
            data: contact,
            message: "New contact created!"
        });
};

api-ruta.ts

import contactController from "./contactController";

En el archivo api-routes.ts, cuando intento importar el módulo contactController, está generando el error

El módulo no tiene exportación por defecto

¿Cómo puedo importar sin el error? He intentado usar "import {contactController} from './contactController'" pero eso tampoco funcionó.

Respuesta #1

Documentación (vea las secciones "Exportar" e "Importar"): Documentación de módulos de Typescript.

Para completar la respuesta de Vasil:

Cuando importas un módulo de esta manera:

// <some_file>.ts
import <whatever_name_I_want> from "<path_to_my_awesome_module>";

<my_awesome_module>.ts necesita tener una exportación por defecto. Por ejemplo, esto se puede hacer de la siguiente manera:

// <my_awesome_module>.ts
export default foo = () => { // notice the 'default' keyword
  // ...
};

export bar = () => {
  // ...
};

Con el código anterior, <whatever_name_I_want> será el método foo (un módulo solo puede tener 1 exportación por defecto). Para importar también el método bar, tendrás que importarlo por separado:

// <some_file>.ts
import <whatever_name_I_want>, { bar } from "<path_to_my_awesome_module>";

Pero según lo que estás intentando hacer, probablemente no hay necesidad de usar una exportación por defecto. Simplemente podrías exportar todos tus métodos con la palabra clave export, así:

// contactController.ts
export index = (req: any, res: any) => { // no need for a default export
  // ...
};

export create = (req: any, res: any) => {
  // ...
};

e impórtalos a ambos ya sea entre corchetes:

// api-routes.ts
import { index, create } from "./contactController";

// Usage
index(...);
create(...);

o en una variable global:

// api-routes.ts
import * as contactController from "./contactController";

// Usage
contactController.index(...);
contactController.create(...);

PD: Renombré tu método new a create porque "new" ya es una palabra reservada en JavaScript.

Respuesta #2

Necesitas cambiar la forma en que exportas a:

const contacts: String[] = [];

// Handle index actions
const index = (req: any, res: any) => {
    res.json({
        data: contacts,
        message: "Contacts retrieved successfully",
        status: "success"
    });
};

// Handle create contact actions
const newContact = (req: any, res: any) => {

     // save the contact and check for errors
    contacts.push("Pyramids");

    res.json({
            data: contact,
            message: "New contact created!"
        });
};

export default {index, newContact};

Entonces deberías poder importarlos así

import routes from './contactController';

Artículos relacionados