2017-02-21 2 views
0

Je n'arrive pas à comprendre comment créer deux fichiers avec le même espace de noms et en importer un dans l'autre dans Typescript.Comment importer correctement le même espace de noms dans deux fichiers différents dans Typescript

Ceci est la situation:

file1.ts

export namespace nspace { 
    export class ClassA { 

    } 
} 

file2.ts

import {nspace} from './file1'; 

export namespace nspace { 
    export class ClassB extends nspace.ClassA { 
     private z: nspace.ClassA; 
    } 
} 

intérieur fichier2 j'ai ces erreurs:

1) Les déclarations individuelles à la fusion la déclaration 'nspace' doit être exportée ou toutes les locales

2) Propriété « ClassA » n'existe pas sur le type « typeof NSPACE »

En plus de cela, ClassA se trouve correctement lorsqu'il est utilisé pour déclarer le type du champ z (il me fait même le fichier correct si j'utilise "aller à la déclaration" dans mon IDE)
J'ai essayé de chercher la première erreur sur Internet parce que je ne comprends pas vraiment ce que cela signifie, mais aucune des pages que j'ai trouvées a aidé. Je lis la documentation sur la déclaration de fusion dans Typescript mais je ne pouvais pas trouver une situation similaire à la mienne
Je ne sais pas si cela aide, mais j'utilise SystemJS dans mon application

Répondre

0

Apparemment, ce qui donne un autre nom lors de l'importation travaillé:

fichier1

export namespace nspace { 
    export class ClassA { 

    } 
} 

fichier2

import * as a from './file1'; 

export namespace nspace { 
    export class ClassB extends a.nspace.ClassA { 
     private b: a.nspace.ClassA; 

    } 
} 
0

Ça devrait être beaucoup plus simple à utiliser:

ClassA.ts
namespace MyApp { 
    export class ClassA { 
     public a: string = "classA"; 
    } 
} 
ClassB.ts
namespace MyApp { 
    export class ClassB extends ClassA { 
     private class_a: ClassA = new ClassA(); 
     private b: string = "classB"; 
    } 
} 
main.ts
namespace MyApp { 
    var b = new ClassB(); 
    console.log(b.class_a.a) // "classA" 
} 

Le compilateur reconnaîtra que vous travaillez dans le même espace de nom, il n'est donc pas nécessaire de le import, ou même de le préfixer.

Il peut être nécessaire d'ajouter une référence au sommet des ClassB.ts fichier en tant que tel: /// <reference path="ClassA.ts" />

Bien que dans ma configuration, je ne l'ai pas eu à ce faire, le compilateur semble prendre les choses correctement automatiquement. (J'utilise un seul OutFile et la directive exclut en tsconfig.json)

Sidenote:

Ce que je trouve étrange dans ce que vous êtes obligé d'exporter ClassA pour elle à découvrir dans mes ClassB.ts. Il semble impossible de garder ClassA et ClassB privé à l'espace de noms si je veux les utiliser dans Main.ts (même dans les variables privées). Il simplement des erreurs avec "Ne peut pas trouver le nom ..."

+0

Pour autant que je l'ai vu est une pratique courante lors de l'utilisation SystemJS, vous avez besoin Importer tout ce dont vous avez besoin dans vos fichiers Ou est-ce que je l'utilise mal? Cela a toujours fonctionné comme ça pour moi – valepu

+1

En fait, je suis très familier avec SystemJS - mais je sais si votre 'tsconf ig.json' est réglé correctement (en utilisant '" module ":" system "') le fichier javascript résultant devrait avoir les instructions d'importation SystemJS correctes. Créez votre tapuscrit de la manière dactylographiée et laissez le compilateur gérer l'environnement. Essayez-le et jetez un coup d'œil à ce type de script compilé pour vous! –

+0

mon tsconfig.json a "module: system" mais si je n'importe pas tout ce que je vais utiliser dans un certain fichier, il échoue quand j'ouvre mon application sur un navigateur. Serait-ce parce que Gulp gère la compilation? (commence à partir de index.ts et navigue les importations). J'utilise ceci comme projet de départ: https://github.com/FountainJS/generator-fountain-angular1 – valepu