2016-11-22 1 views
2

zu exportieren, wenn ich eine Datei myinterface.tsdefinieren Schnittstellen ohne sie

interface MyInterface { 
    foo() : string 
} 

und eine zweite Datei myimplementation.ts

class MyImplementation implements MyInterface { 
    ... 
} 

Frage 1 haben: Warum funktioniert das? Ich exportiere die Schnittstelle nicht.

Dann, wenn ich foo() : string-foo() : SomeType ändern möchten, wo SomeType in einem anderen Modul definiert ist, muss ich myinterface.ts ändern sein:

import { SomeType } form 'some-module'; 
interface MyInterface { 
    foo() : SomeType 
} 

Dies verursacht Fehler in myimplementation.ts sagen „nicht finden können, Name 'MyInterface' ".

Frage 2: Was die Art und Weise ändert, um eine * .ts-Datei geändert wird, wenn Sie einen Import (oder einen Export) im Vergleich zu addieren, wenn die Datei-Schnittstellen nur enthält (und sie sind nicht sogar als Export markiert).

Ich verstehe, dass die beste Praxis wäre, einfach meine Schnittstelle als Export zu markieren und zu tun import {MyInterface} from 'myinterface';, aber ich versuche zu verstehen, warum die ursprüngliche Version funktioniert, und was die Auswirkungen sind.

+0

TS-Schnittstellen sind nicht real in dem Sinne, dass sie ausführbaren Code erzeugen, sie fungieren als Verträge für das Typsystem und werden vor der Ausgabe verworfen. Sie sind sehr ähnlich wie'Enum' in diesem Sinne. Sie können sie nicht importieren oder exportieren, da sie nicht existieren. – ssube

+0

Ich verstehe das, aber es scheint zu gelten, 'importierenSomeInterface} von 'some-modul';', also stelle ich mir vor es ist eine Art Hinweis auf TSC. Ich bin eigentlich neugierig auf die Verwendung von Schnittstellen in einer anderen Datei definiert. – Kir

+0

@ssube das ist nicht ganz richtig. Wenn ich die Schnittstelle zu 'SomeUndefinedInterface' ändere, wird ein Compilerfehler ausgelöst. Die Schnittstelle muss irgendwo definiert sein, und ich stimme @Kir zu, dass es mystisch ist, dass sie die Definition in der anderen Datei ohne einen expliziten Import kennt: "Umgekehrt, um eine Variable, Funktion, Klasse, Schnittstelle, usw. zu exportieren anderen Modulen muss es mit einem der Importformulare importiert werden. Module sind deklarativ, die Beziehungen zwischen den Modulen werden auf Dateiebene hinsichtlich des Imports und Exports angegeben. " Typescript-Handbuch – Orphid

Antwort

1

Schnell Untersuchung:

Ich habe dies in InterfaceFile.ts:

interface MyInterface { 
    foo(): string 
} 

var s = 4; 

Und dies in einer Datei namens ImplFile.ts

class MyImplementation implements MyInterface { 
    foo(): string { 
     return 'foo'; 
    } 
} 

s.toExponential(1); 

Nun, wenn ich bei der kompilierten aussehen InterfaceFile.js Ich sehe das:

var s = 4; 

Und die s.toExponential(1) in ImplFile.ts verursachen den Compiler keine Probleme (Webstorm formatiert es auch als global).

Jetzt, wenn ich explizit exportieren s;

interface MyInterface { 
    foo(): string 
} 

export var s = 4; 

ich diese:

exports.s = 4; 

Und weders noch MyInterface zur Verfügung stehen, ohne einen Import

Also, es scheint, wie wenn man etwas in der Datei nicht exportieren, es wird als global behandelt. Ich vermute, dass, wenn etwas exportiert wird, die Datei ein Modul wird.

+0

Der obige Link erklärt einfach, dass 'exports' ein Verweis auf' module exports' ist, also wird 'exports = XXX' nicht funktionieren. – Kir

+0

@Kir du hast Recht, denke ich. Ich werde meine Antwort bearbeiten. – Orphid

Verwandte Themen