Importierte Schnittstelle für TypeScript-Export


93

Ich verwende AMD-Module und möchte eine komplexe Schnittstelle hinter einer Datei verbergen, die mehrere andere Dateien lädt und auswählt, was und wie verfügbar gemacht werden soll. Es funktioniert, ich benutze diese Lösung, aber es fühlt sich irgendwie hässlich an, hauptsächlich mit den Schnittstellen.

import Types = require('./message-types');
import MessageBaseImport = require('./message-base');
export interface IMessage extends Types.IMessage {} // This is an interface
export var MessageBase = MessageBaseImport; // This is a class

Verwendung:

import Message = require('message');
import { * } as Message from 'message'; // Or with ES6 style
var mb = new Message.MessageBase(); // Using the class
var msg: Message.IMessage = null; // Using the interface 

Gibt es bessere Lösungen? Ich möchte nicht alles in eine einzelne Datei einfügen, sondern importeine einzelne Datei.

Antworten:


168

Es gibt eine Export-Import-Syntax für ältere Module und ein Standard-Exportformat für moderne ES6-Module:

// export the default export of a legacy (`export =`) module
export import MessageBase = require('./message-base');

// export the default export of a modern (`export default`) module
export { default as MessageBase } from './message-base';

// export an interface from a legacy module
import Types = require('./message-types');
export type IMessage = Types.IMessage;

// export an interface from a modern module
export { IMessage } from './message-types';

3
Es ist jedoch illegal, diese Art des Reexports in einem Namespace zu verwenden
E-Cloud

5
Gibt es einen Einzeiler für den Export und Import einer Schnittstelle in TS, ähnlich Ihrem alten Beispiel? Oder es geht nur darum, dieselbe Zeile zu importieren und dann wiederzuverwenden, sie aber in einen Export zu ändern, z. import { IMessage } from './message-types';und dann in der nächsten Zeile habenexport { IMessage } from './message-types';
mtpultz

1
Warum ist das @ e-cloud? Können Sie einige Beispiele / Hintergründe nennen?
lukas_o

60

Einige weitere Beispiele neben der Antwort von # c-snover von hier . Sie können sie zusammenstellen.

import 'jquery';                        // import a module without any import bindings
import $ from 'jquery';                 // import the default export of a module
import { $ } from 'jquery';             // import a named export of a module
import { $ as jQuery } from 'jquery';   // import a named export to a different name
import * as crypto from 'crypto';       // import an entire module instance object

export var x = 42;                      // export a named variable
export function foo() {};               // export a named function

export default 42;                      // export the default export
export default function foo() {};       // export the default export as a function

export { encrypt };                     // export an existing variable
export { decrypt as dec };              // export a variable as a new name
export { encrypt as en } from 'crypto'; // export an export from another module
export * from 'crypto';                 // export all exports from another module
                                        // (except the default export)

Vielen Dank. Aber warum ist die letzte Importvariante von allen anderen getrennt? Sollte es nicht direkt unter den anderen vier sein?
Venryx

Es ist von der verwiesenen Seite.
Gábor Imre


1
Sie finden den defekten Link im Verlauf des Repositorys: github.com/systemjs/systemjs/blob/…
Peter

3

Insbesondere in meinem Fall musste ich die Schnittstelle deklarieren, anstatt sie zu exportieren.

declare interface IFluxStoreSyncOptions{
  namespacedKey: string;
}

So verwenden Sie die Schnittstelle als Typ in einer anderen Datei wie folgt:

export function FluxStoreSync(options: IFluxStoreSyncOptions){
}

Auf diese Weise müssen Sie die Schnittstelle nicht exportieren und importieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.