Импортированный интерфейс экспорта TypeScript


100

Я использую модули AMD и хочу спрятать сложный интерфейс за одним файлом, который загружает несколько других файлов и выбирает, что и как раскрыть. Это работает, я использую это решение, но оно кажется некрасивым, в основном с интерфейсами.

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

Применение:

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 

Есть ли лучшие решения? Я не хочу помещать все в один файл, а хочу в importодин файл.

Ответы:


184

Существует синтаксис экспорта и импорта для устаревших модулей и стандартный формат экспорта для современных модулей ES6:

// 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
Однако незаконно использовать этот стиль реэкспорта в пространстве имен
— e-cloud

5
Есть ли однострочник для экспорта и импорта интерфейса в TS, подобный вашему унаследованному примеру? Или это просто случай импорта, а затем повторного использования той же строки, но изменения ее на экспорт, например. import { IMessage } from './message-types';а затем на следующей строчкеexport { IMessage } from './message-types';
— mtpultz 03

1
Почему это @ электронное облако? Вы можете привести несколько примеров / предыстории?
— lukas_o

63

Еще несколько примеров, помимо ответа # c-snover отсюда . Вы можете собрать их вместе.

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)

Спасибо. Но почему последний вариант импорта отделен от всех остальных? Разве не должно быть чуть ниже остальных четырех?
— Venryx

Это с указанного сайта.
— Габор Имре,

неработающая ссылка github.com/systemjs/systemjs/blob/master/docs/…
— Simon Meusel

1
Вы можете найти битую ссылку в истории репозитория: github.com/systemjs/systemjs/blob/…
— Питер,

3

В частности, в моем случае мне пришлось «объявить» интерфейс вместо его экспорта.

declare interface IFluxStoreSyncOptions{
  namespacedKey: string;
}

Чтобы использовать интерфейс как тип в другом файле, например:

export function FluxStoreSync(options: IFluxStoreSyncOptions){
}

Таким образом, вам не нужно экспортировать и импортировать интерфейс.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.