2017-01-24 2 views
-1

Ich versuche, einige Arten zu entwickeln. Was ich erreichen wollte, war, diese Typen mit einer solchen Syntax importieren zu können.Warum kann ich ein Modul als Klasse verwenden?

import {myModule} from "myModule"; 

Ich habe es geschafft, aber ich weiß nicht, warum es funktioniert, wie es funktioniert. Ich meine, es ist perfekt, dass es so funktioniert, das einzige Problem ist, dass ich es nicht verstehe.

Hier ist, wie mein Code in index.d.ts Datei:

namespace myModule { 
    export interface myInterface { 
    .... 
    } 

export class myModule { 
    .... 
    } 
} 

declare module "myModule" { 
    export = myModule; 
} 

Die größte Sache ist, dass ich es so, dass verwenden:

import {myModule} from "myModule"; 
let myModuleInstanceVariable = new myModule(); 
let anotherVariable: myModule.myInterface; 

Und es funktioniert, (Intelisense und Typ Überprüfung funktioniert ordnungsgemäß), aber ich habe eine Frage:

Wie es möglich ist, dass ich myModule einmal als Klassenname und dann als Namesp verwenden kann As?

EDIT:

Ok Es scheint, dass ich das ganze Konzept der Erklärungen falsch verstanden.

import {myModule} from "myModule"; importiert eine Klasse MyModule

konnte ich MyModule Namespace zugreifen, weil es einen Umfang verunreinigt (Namespace auf der .d.ts Datei zugänglich sind, aus einer anderen Datei, wenn die .d.ts in tsconfig.ts ist), bevor ich auch importiert genannt etwas.

Dank @Ryan Cavanaugh für Ihre Hilfe.

+1

Es scheint, als ob Sie den Unterschied zwischen 'import {myModule} von" myModule ";' und 'import * als myModule von" myModule "vermissen;' –

+0

@RyanCavanaugh Könnten Sie mir bitte in Ihrer Antwort aufklären? – FieryCod

+0

Haben Sie versucht, 'import *' zu verwenden und zu sehen, wie es funktioniert? –

Antwort

4

Wie ist es möglich, dass ich myModule einmal als Klassenname und dann als Namespace verwenden kann?

Namespaces, Typen und Werte sind drei verschiedene Arten von Dingen und es ist nie mehrdeutig, auf was Sie sich beziehen.

Ein Namensraum immer in einer Art Position auf der linken Seite erscheint ein Punkt:

let x: SomeNamespace.SomeType; 
     ^^^^^^^^^^^^^ 

Ein Typ erscheint immer in einer Art Position, möglicherweise rechts von einem Punkt in einer Art Position:

let x: SomeNamespace.SomeType; 
        ^^^^^^^^ 
let y: SomeType; 
     ^^^^^^^^ 

Ein Wert immer in einem Ausdruck erscheint:

let z = SomeValue; 
     ^^^^^^^^^ 

So ist es einfach kein Konflikt i n Derselbe Bezeichner, der sich auf einen Namespace, Typ und Wert bezieht. Welcher davon gemeint ist, wird immer eindeutig durch den Kontext bestimmt.

+0

Warum kann ich eine Instanz erstellen? eine Klasse? Warum ist die Syntax nicht wie in myinstance = new myModule.myModule(); ?? – FieryCod

+0

Das Beispiel in Ihrer Frage ist sehr unklar. Woher kommt zum Beispiel 'AirConsole'? –

+0

Netter Fang;) ja ich wollte 'myModule' schreiben. Ich versuche, ein Beispiel so einfach wie möglich zu machen. Natürlich sollte es von 'myModule' sein. – FieryCod

Verwandte Themen