【问题标题】:TypeScript export imported interfaceTypeScript 导出导入接口
【发布时间】:2015-08-23 03:01:02
【问题描述】:

我使用 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 一个文件。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    遗留模块有导出导入语法,现代 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';
    

    【讨论】:

    • 但是,在命名空间中使用这种重新导出方式是违法的
    • 在 TS 中是否有与您的旧示例类似的用于导出和导入接口的单行程序?还是只是导入然后重用同一行,但将其更改为导出的情况,例如。 import { IMessage } from './message-types'; 然后在下一行有export { IMessage } from './message-types';
    • 为什么是@e-cloud?你能举一些例子/背景吗?
    【解决方案2】:

    除了来自here 的#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)
    

    【讨论】:

    【解决方案3】:

    特别是在我的情况下,我不得不“声明”接口而不是导出它。

    declare interface IFluxStoreSyncOptions{
      namespacedKey: string;
    }
    

    为了将接口用作另一个文件中的类型,如下所示:

    export function FluxStoreSync(options: IFluxStoreSyncOptions){
    }
    

    这样你就不必导出和导入界面了。

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 1970-01-01
      • 2018-07-02
      • 2016-12-26
      • 2018-04-05
      • 2021-08-09
      • 2020-03-06
      • 2018-08-24
      • 2017-04-17
      相关资源
      最近更新 更多