因此,另一个问题的一般答案(如何使用打字稿导入模块)是:
1)创建一个blah.d.ts定义文件。
2)使用:
/// <reference path="./defs/foo/foo.d.ts"/>
import foo = require("foo");
重要的是,你需要两个文件foo.d.ts和你要加载的node_modules中的foo.js; 和 NAME foo必须完全匹配。现在...
我想回答的问题是如何编写一个可以这样导入的打字稿模块?
假设我有一个这样的模块:
- xq/
- xq/defs/Q.d.ts
- xq/index.ts
- xq/base.ts
- xq/thing.ts
我想从base.ts导出模块'xq'和'Base',从thing.ts导出'Thing'。
如果这是javascript中的节点模块,我的index.ts看起来像是:
var base = require('./base');
var thing = require('./thing');
module.exports = {
Base: base.Base,
Thing: thing.Thing
};
让我们尝试使用类似的打字稿文件:
import base = require('./base');
export module xq {
export var base = base.Base;
}
调用它:
tsc base.ts index.ts things.ts ... --sourcemap --declaration --target ES3
--module commonjs --outDir dist/xq
会发生什么?好吧,我们得到我们的base.d.ts:
export declare class Base<T> {
...
}
和令人兴奋的无用的index.d.ts:
export declare module xq {
var Base: any; // No type hinting! Great. :(
}
并且没有事件导入模块的完全无效的javascript:
(function (xq) {
xq.base = xq.base.Base;
})(exports.xq || (exports.xq = {}));
var xq = exports.xq;
我尝试了很多关于主题的变化,我唯一可以上班的是:
declare var require;
var base = require('./base');
export module xq {
export var base = base.Base;
}
...但这显然完全破坏了类型检查器。
因此。
打字稿很棒,但这个模块的东西很糟糕。
1)是否可以使用内置定义生成器(我很怀疑)
2)你是如何手工完成的?我在.d.ts文件中看过import语句,我认为这意味着有人已经想出如何做到这一点;那些工作怎么样?如何为具有带import语句的声明的模块执行打字稿?
(例如,我怀疑进行模块声明的正确方法是:
/// <reference path="base.d.ts" />
declare module "xq" {
import base = require('./base');
module xq {
// Some how export the symbol base.Base as Base here
}
export = xq;
}
......但我不知道那些打字稿会是什么样的。)
答案 0 :(得分:7)
对于JavaScript:
var base = require('./base');
var thing = require('./thing');
module.exports = {
Base: base.Base,
Thing: thing.Thing
};
TypeScript:
import base = require('./base');
import thing = require('./thing');
var toExport = {
Base: base.Base,
Thing: thing.Thing
};
export = toExport;
甚至这个打字稿:
import base = require('./base');
import thing = require('./thing');
export var Base = base.Base;
export var Thing = thing.Thin;
答案 1 :(得分:2)
Typescript已经有了很大的改进。在最近的Typescript版本中,该语言已经成为Javascript的一个更严格的超集。
导入/导出模块的正确方法现在是新的ES6模块语法:
myLib.ts
export function myFunc() {
return 'test'
}
package.json
{
"name": "myLib",
"main": "myLib.js",
"typings": "myLib.d.ts"
}
然后,家属可以使用新的ES6语法导入您的模块:
dependent.ts
import { myFunc } from 'myLib'
console.log(myFunc())
// => 'test'
有关用Typescript编写的节点模块的完整示例,请查看此样板: