TypeScript dışa aktarım ithal arayüzü


103

AMD modüllerini kullanıyorum ve birkaç başka dosyayı yükleyen ve neyin nasıl ifşa edileceğini seçen karmaşık bir arayüzü bir dosyanın arkasına gizlemek istiyorum. Çalışıyor, bu çözümü kullanıyorum ama çoğunlukla arayüzlerde biraz çirkin geliyor.

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

Kullanım:

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 

Orada daha iyi bir çözüm var mı? Her şeyi tek bir dosyaya koymak istemiyorum ama tek bir dosyaya koymak istiyorum import.

Yanıtlar:


186

Eski modüller için bir dışa aktarma içe aktarma sözdizimi ve modern ES6 modülleri için standart bir dışa aktarma biçimi vardır:

// 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';

// when '--isolatedModules' flag is provided it requires using 'export type'.
export type { 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
Ancak, bir ad alanında bu yeniden dışa aktarma stilini kullanmak yasa dışıdır
e-cloud

5
Eski örneğinize benzer bir TS'de bir arayüzün dışa ve içe aktarılması için tek satırlık bir araç var mı? Ya da sadece aynı satırı içe aktarma ve sonra yeniden kullanma, ancak bunu bir dışa aktarmaya değiştirme, örn. import { IMessage } from './message-types';ve sonra bir sonraki satırdaexport { IMessage } from './message-types';
mtpultz

1
Bu neden @ e-cloud? Bazı örnekler / arka plan verebilir misiniz?
lukas_o

64

Burada # c-snover'ın cevabının yanı sıra birkaç örnek daha . Onları bir araya getirebilirsiniz.

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)

Teşekkürler. Ama neden son ithal varyantı diğerlerinden ayrıldı? Diğer dördünün hemen altında olması gerekmez mi?
Venryx

Yönlendirilen siteden.
Gábor Imre


1
Bozuk bağlantıyı arşivin
Peter

3

Özellikle benim durumumda, arayüzü dışa aktarmak yerine 'bildirmek' zorunda kaldım.

declare interface IFluxStoreSyncOptions{
  namespacedKey: string;
}

Arayüzü başka bir dosyada bunun gibi bir tür olarak kullanmak için:

export function FluxStoreSync(options: IFluxStoreSyncOptions){
}

Bu şekilde arayüzü dışa ve içe aktarmanız gerekmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.