Javascript 类型脚本默认导出
我刚开始看Typescript,玩的时候遇到了一个问题。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
我想写一个库来管理一个通用的树结构,并做一些非常基本的测试来了解TS是如何工作的 使用3个文件开始简单设置:
- 绿色森林
- GTree.ts
- GNode.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
与任何其他名为的导出一样。使用ES6default
导出
我引用Mozilla的文章:
如果您希望自己的ES6模块具有默认导出,那么这很容易做到。默认导出没有什么神奇之处;它与任何其他导出一样,只是名为“default”
在您的test.js
文件中,“default”功能不雅观,因为您希望使用ES6default
从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”)
insidetest.js
而不是import
,然后将文件编译为js?@Maximus我只是将test.js作为一个简单的节点脚本运行。不知道为什么我要写导入,然后为这个(?)编译。没关系,请看我的答案是的,当然,但为什么它会这样做?是否导出默认类林
将TS中的语法正确地用作模块;为什么它必须添加默认属性?如果我想把它公开为一个库,default
只会让它看起来很难看…@KimGysen,updated。你们图书馆的消费者会使用什么模块系统?也许是我,但我觉得这很尴尬。在文章:模块结构指南
一节中,他们说:如果只导出单个类或函数,请使用导出默认值
。然而,它附带了default
属性的成本,这使得commonjs用户的导入变得笨重。但是,如果我不这样做,则需要使用大括号import{GForest}等
。我正在寻找一种默认导出的方法,只需导入而不产生不必要的副作用。@KimGysen,您指的是TypeScript的文档,但是您使用的是JSes5
,因为我碰巧在TS中编写了库,这不意味着消费者应该这样做吗?Test.js只是一个任意消费者的代表,我不想让它成为一个固执己见的库。@KimGysen好的,我想我理解你需要什么。我编辑了。这就是我需要的。。。我仍然不清楚他们为什么提倡使用默认导出()。似乎没有增加任何好处。@KimGysen可能是因为这是标准ES6提倡的方式?@Maximus My bad!我忘了删除第一个导出。我编辑。