打字稿默认导出

时间:2016-11-23 10:31:42

标签: javascript typescript

我刚刚开始看看打字稿并在玩游戏时遇到问题 我想编写一个库来管理一般的树结构,只是做一些非常基本的测试来看看TS是如何工作的。

使用3个文件开始简单设置:

  • GForest.ts
  • GTree.ts
  • GNode.ts

目前,GForest.ts:

import * as Immutable   from "immutable"; 
import GTree            from "./GTree"; 

export default class Forest{ 
    public static createTree(){ 
        let tree = new GTree(); 
    } 
} 

GTree.ts:

export default class GTree{ 
    constructor(){ 
        console.log("Tree constructed"); 
    } 

    public static createNode(){ 

    } 
} 

我创建了一个简单的test.js文件来调用库(编译TS到ES5):

var GForest = require("./build/GForest"); 

console.log(GForest); 

运行时

> node test

输出结果为:

我不明白为什么结果是:

{ default: { [Function: Forest] createTree: [Function] } }

为什么有default为对象的对象,如何更改此对象以实现所需的行为?

因此,我无法打电话:

GForest.createTree(); 

(我希望通过静态工厂公开树的创建) 有帮助吗?

2 个答案:

答案 0 :(得分:2)

使用ES6 default导出

我引用了Mozilla的文章ES6 In Depth: Modules

  

如果您希望自己的ES6模块具有默认导出功能,那么这很容易实现。默认导出没有什么神奇之处;它就像任何其他导出一样,除了名为"default"

test.js文件中,“默认”功能不够优雅,因为您希望使用ES5语法中的ES6 default导出。我建议在TypeScript的帮助下使用ES6语法:

// test.ts
import GForest from "./build/GForest";
console.log(GForest); // { [Function: Forest] createTree: [Function] }

此代码编译为:

var GForest_1 = require("./build/GForest"); 
console.log(GForest_1.default);

直接导出类

在TypeScript中,您可以使用非标准语法export =直接导出成员。

示例:

// GForest.ts
import * as Immutable   from "immutable"; 
import GTree            from "./GTree"; 

class Forest{ 
    public static createTree(){ 
        let tree = new GTree(); 
    } 
}
export = Forest;

然后,将其与代码ES3 / 5一起使用:

// test.js
let GForest = require("./build/GForest");
console.log(GForest); // { [Function: Forest] createTree: [Function] }

...或者,在TypeScript中:

// test.ts
import GForest = require("./build/GForest");
console.log(GForest); // { [Function: Forest] createTree: [Function] }

请参阅the documentation on export = here

答案 1 :(得分:1)

  

为什么有一个默认为键的对象,如何将其更改为   实现理想的行为?

那是因为它是从编译的GForest.js导出的内容:

"use strict";
var GTree_1 = require("./GTree");
var Forest = (function () {
    function Forest() {
    }
    Forest.createTree = function () {
        var tree = new GTree_1["default"]();
    };
    return Forest;
}());
exports.__esModule = true;
exports["default"] = Forest;

您需要使用.default来引用构造函数:

var GForest = require("./build/GForest").default; 

Typescript使用es6模块语法,可以导出多个模块。然后将此代码编译为commonjs es5模块语法。 Typescript编译器使用properties对象上的exports映射在es6模块语法上定义的多个导出。 default就像任何其他named导出一样。