你如何使用打字机编写节点模块?

所以,另一个问题(如何使用打字机导入模块)的一般答案是:

1)创build一个blah.d.ts定义文件。

2)使用:

/// <reference path="./defs/foo/foo.d.ts"/> import foo = require("foo"); 

关键的是,你需要在你的node_modules的某个地方加载文件foo.d.ts和foo.js; NAME foo必须完全匹配。 现在…

我想要回答的问题是如何编写一个可以以这种方式导入的打字稿模块?

比方说,我有一个这样的模块:

 - xq/ - xq/defs/Qdts - 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> { ... } 

和惊人的无用索引。

 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; } 

但是,这显然完全破坏了types检查。

所以。

Typescript是伟大的,但这个模块的东西完全糟透了。

1)是否有可能与内置的定义生成器(我是可疑的)

2)你是怎么做的? 我在.d.ts文件中看到过导入语句,我认为这意味着有人已经知道如何做到这一点; 这些工作如何? 你如何做一个模块的打字稿,其中有一个导入声明的声明?

(例如,我怀疑正确的方式来做一个模块声明是:

 /// <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; } 

…但我不知道打字稿是怎么回事)。

对于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; 

自从这个问题被问到后,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编写的节点模块的完整示例,请查看此样板:

https://github.com/bitjson/typescript-starter/