Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类型脚本默认导出_Javascript_Typescript - Fatal编程技术网

Javascript 类型脚本默认导出

Javascript 类型脚本默认导出,javascript,typescript,Javascript,Typescript,我刚开始看Typescript,玩的时候遇到了一个问题。 我想写一个库来管理一个通用的树结构,并做一些非常基本的测试来了解TS是如何工作的 使用3个文件开始简单设置: 绿色森林 GTree.ts GNode.ts 目前,GForest.ts: import * as Immutable from "immutable"; import GTree from "./GTree"; export default class Forest{ public

我刚开始看Typescript,玩的时候遇到了一个问题。
我想写一个库来管理一个通用的树结构,并做一些非常基本的测试来了解TS是如何工作的

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

  • 绿色森林
  • 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):

跑步时

> node test
输出为:

我不明白为什么结果是:

{ default: { [Function: Forest] createTree: [Function] } }
为什么有一个对象的键是
default
,我如何更改它以实现所需的行为

因此,我无法直接拨打:

GForest.createTree(); 
(我想通过静态工厂公开树的创建) 有什么帮助吗

为什么会有一个默认为键的对象,我如何将其更改为 达到期望的行为

这是因为它是从编译后的
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编译器使用
exports
对象上的
properties
映射在
es6
模块语法上定义的多个导出。而且
default
与任何其他名为
的导出一样。

使用ES6
default
导出 我引用Mozilla的文章:

如果您希望自己的ES6模块具有默认导出,那么这很容易做到。默认导出没有什么神奇之处;它与任何其他导出一样,只是名为
“default”

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

// test.ts
import GForest from "./build/GForest";
console.log(GForest); // { [Function: Forest] createTree: [Function] }
// test.ts
import GForest = require("./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 from "./build/GForest";
console.log(GForest); // { [Function: Forest] createTree: [Function] }
// test.ts
import GForest = require("./build/GForest");
console.log(GForest); // { [Function: Forest] createTree: [Function] }

请参阅。

为什么使用
var GForest=require(“./build/GForest”)
inside
test.js
而不是
import
,然后将文件编译为js?@Maximus我只是将test.js作为一个简单的节点脚本运行。不知道为什么我要写导入,然后为这个(?)编译。没关系,请看我的答案是的,当然,但为什么它会这样做?是否
导出默认类林
将TS中的语法正确地用作模块;为什么它必须添加默认属性?如果我想把它公开为一个库,
default
只会让它看起来很难看…@KimGysen,updated。你们图书馆的消费者会使用什么模块系统?也许是我,但我觉得这很尴尬。在文章:
模块结构指南
一节中,他们说:
如果只导出单个类或函数,请使用导出默认值
。然而,它附带了
default
属性的成本,这使得commonjs用户的导入变得笨重。但是,如果我不这样做,则需要使用大括号
import{GForest}等
。我正在寻找一种默认导出的方法,只需导入而不产生不必要的副作用。@KimGysen,您指的是TypeScript的文档,但是您使用的是JS
es5
,因为我碰巧在TS中编写了库,这不意味着消费者应该这样做吗?Test.js只是一个任意消费者的代表,我不想让它成为一个固执己见的库。@KimGysen好的,我想我理解你需要什么。我编辑了。这就是我需要的。。。我仍然不清楚他们为什么提倡使用默认导出()。似乎没有增加任何好处。@KimGysen可能是因为这是标准ES6提倡的方式?@Maximus My bad!我忘了删除第一个导出。我编辑。