2016-01-12 32 views
5

Desidero riesportare un intero modulo e sovrascrivere solo una funzione specifica del modulo riesportato. Ma sembra che l'esportazione della funzione di override non venga elaborata quando la stessa funzione è già reesportata.es2015 modulo di riesportazione e sovrascrittura della funzione di esportazione singola del modulo riesportato

(http://www.ecma-international.org/ecma-262/6.0/#sec-module-semantics-static-semantics-early-errors, 'si tratta di un errore di sintassi se i ExportedNames di ModuleItemList contiene tutte le voci duplicate.')

La motivazione dietro il mio approccio è quello di ridurre al minimo ri-esportazione di un modulo molto grande o molto esplicito, se io desidera solo eseguire l'override di una funzione o un metodo specifici nel modulo riesportato.

Esiste un modo per implementare il mio approccio in es6/es2015?

Il mio codice finora:

modulo-a.js

export class MyFirstStandardClass { 
    sendMeMessages() { 
    return `hello, I'm a standard implementation`; 
    } 
} 
export function talkToMe() { 
    return `standard talking: how are you doing?`; 
} 

module-b.js

import * as StandardModule from 'module-a'; 

export function talkToMe(condition = true) { 
    if (condition) { 
    return `project conditional talking: ${StandardModule.talkToMe()}`; 
    } 
    return `project without a condition!`; 
} 

export * from 'module-a'; 

module-c.js

import * as MyModule from 'module-b'; 
import React, { Component } from 'react'; 

export default class App extends Component { 

    componentWillMount() { 
    console.log(MyModule); 
    this.myFirstStandardInstance = new MyModule.MyFirstStandardClass(); 
    } 

    render() { 
    return (
     <div> 
     <label> 
      Class 
     </label> 
     <div> 
      { this.myFirstStandardInstance.sendMeMessages() } 
     </div> 
     <label> 
      Function 
     </label> 
     <div> 
      { MyModule.talkToMe(true) } // returns 'standard talking: how are you doing?'; expected 'project conditional talking: standard talking: how are you doing?' 
     </div> 
     </div> 
    ); 
    } 
} 

risposta

0

È può selezionare quali moduli da module-a esportare t su una riga. Quindi nel tuo module-b.js si può fare:

// export all modules excluding `talkToMe` 
export { MyFirstStandardClass, someOtherModule } from 'module-a'; 

export function talkToMe(condition = true) { 
    // ... 
} 

Oppure si può esportare oggetto predefinito e scegliere cosa escludere/sovrascrivere con Object.assign():

import * as StandardModule from 'module-a'; 

const overridenExports = { 
    talkToMe: function(condition = true) { 
     // ... 
    } 
} 

const myModule = Object.assign({}, StandardModule, overridenExports); 

export default myModule; 

e l'importazione di default come:

import MyModule from 'module-b'; 
+0

2 Grazie per la risposta. L'ho già provato e funziona. Ma se hai molti moduli secondari nel modulo, la lista sarebbe molto lunga. –