使用 Typescript 1.5 构建 Node 包并生成声明文件

Build a Node package using Typescript 1.5 and generate the declaration file

我是 Javascript、Node 和 Typescript 的新手,正在努力使用它们。


TL;DR


这是我的故事:

我想使用 Typescript 将 javascript 库编码为 Node.js 格式。最后,我想生成适当的声明文件以供将来的 Typescript 开发使用。我用gulp-typescript来全部编译。

经过数小时的研究和错误...

这是我所做的:

foo.ts

export class Foo {
    private id: number;
    constructor() {
        this.id = 0;
    }
}

impl.ts

import foo = require('foo');

export function make(): boolean {
    var f = new foo.Foo();
    return true;
}

main.ts

declare module 'test' {
    export import impl = require('impl');
}

module.exports = {
    impl: require('impl')
};

gulpfile.js

var gulp = require('gulp')
  , ts = require('gulp-typescript');    

var TS_FILES = 'src/**/*.ts';    

gulp.task('default', ['build_node']);    

// Compile the node package from Typescript source code
gulp.task('build_node', function() {
  var project = ts.createProject({
    declarationFiles: true,
    emitDecoratorMetadata: true,
    module: 'commonjs',
    noEmitError: true,
    noImplicitAny: true,
    removeComments: true,
    target: 'ES5'
  });    

  var tsResult = gulp.src(TS_FILES)
  .pipe(ts(project));    

  tsResult.js
  .pipe(gulp.dest('build'));    

  tsResult.dts
  .pipe(gulp.dest('definition'));
});

这是我得到的:

foo.d.ts

export declare class Foo {
    private id;
    constructor();
}

impl.d.ts

export declare function make(): boolean;

main.d.ts

declare module 'test' {
    export import impl = require('impl');
}

foo.jsimpl.js 看起来很正常。还有...

main.js

module.exports = {
    impl: require('impl')
};

我什至不知道它是否有效,但可以肯定的是,它对我来说看起来不对......我的意思是我真的认为我搞砸了而且这不是构建节点包的正确方法它的声明文件。

原因?

当我查看 DefinitelyTyped 声明文件时,它们中的大多数都在一个文件中,每个 export 声明都很好地包含如下:

declare module 'test' {
    export function make(): boolean;
    ...
}

并且有一个节点包公开其 API 一个跟随:

module.exports = {
    version: '1.0',
    impl: require('impl');
}

我读了数百本 post,但似乎没有任何东西能产生我想要的东西。

你能给我解释一下吗:

编辑: 我没有使用 export = 因为我希望能够在一个文件中声明和导出多个内容。例如:在同一个文件中有一个 class 和构造函数辅助函数。

很多 方法可以做到这一点,因为还没有 官方 支持。您可以在此处跟踪官方支持:https://github.com/Microsoft/TypeScript/issues/2338

不过我用的是https://github.com/TypeStrong/atom-typescript#packagejson-support

NPM 上的示例项目:https://github.com/basarat/ts-npm-module
示例项目使用 来自 NPM 的项目:https://github.com/basarat/ts-npm-module-consume

这就是我构建有用的东西的方法

project

  • 按原样单独构建js库。
    • 从输出中删除所有 ///<reference ... 个标签
  • 从模板构建类型定义文件
    • 按原样构建定义文件
    • 将它们全部连接到一个文件中
    • 从输出中删除所有 ///<reference ... 标签和 import
    • 将输出条目插入模板 index.tmpl.d.ts 文件
    • declare export ...替换为export ...