2017-08-22 1 views
3

Tenir compte de la tapuscrit suivante:Comment pouvez-vous référencer un espace de noms déclaré en dehors de l'espace de noms actuel avec le même nom?

export namespace Test { 
    export const test = "test"; 
} 
export namespace Wrapper { 
    export namespace Test { 
     export const value = Test.test; // "<script>".Wrapper.Test has no exported member 'test'. 
    } 
} 

En raison de la façon tapuscrit compile en JavaScript, la deuxième déclaration de Test au sein Wrapper créera un nouveau champ où Test ne mentionnerai que lui-même. Le niveau supérieur Test n'est pas disponible dans cette étendue, au moins en fonction du vérificateur de type TypeScript.

Je génère le TypeScript à partir d'un autre langage où ce genre de collision d'espace de noms n'est pas une grosse affaire. En TypeScript, cependant, il en résulte une erreur de compilation. L'application est toujours exécutée, il semble donc s'agir d'un problème de type TypeScript et non d'un problème d'exécution JavaScript réel.

Existe-t-il des solutions de contournement connues dans TypeScript?

J'ai un repro mis en place dans un Gluon issue.

Répondre

1

Vous pouvez créer un alias pour surmonter la collision d'espaces de noms:

export namespace Test { 
    export const test = "test"; 
} 

import _Test = Test; 

export namespace Wrapper { 
    export namespace Test { 
     export const value = _Test.test; 
    } 
} 
+0

Merci, Bill. Je pense que je pourrais codage ceci aussi, mais devrait-il vraiment être un problème de vérificateur de type? Il semble être JavaScript valide à l'exécution. – panesofglass

+0

'namespace' est une construction de typeScript (pas JavaScript). Il compile dans un wrapper de fonction. Allez-y et compilez-vous pour voir à quoi ressemble le JavaScript actuel. Vous verrez que le JS ressemble beaucoup à ce qui précède, et a en fait les mêmes problèmes de nommage. –

+0

Il semble que l'équipe TypeScript soit consciente de ce problème - voir [cette demande de fonctionnalité refusée pour l'introduction d'une référence de portée globale] (https://github.com/Microsoft/TypeScript/issues/983) qui a été soumise par Anders Hejlsberg –