使用 Typescript 1.5 构建 Node 包并生成声明文件
Build a Node package using Typescript 1.5 and generate the declaration file
我是 Javascript、Node 和 Typescript 的新手,正在努力使用它们。
TL;DR
- 我们如何使用 Typescript 正确构建节点包?
- 我们如何在一个漂亮的文件中正确地构建一个匹配节点包 API 的声明文件?
这是我的故事:
我想使用 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'));
});
这是我得到的:
- 3 个声明文件:
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');
}
- 3 javascript 个文件:
foo.js
和 impl.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,但似乎没有任何东西能产生我想要的东西。
你能给我解释一下吗:
- 我们如何使用 Typescript 正确构建节点包?
- 我们如何在一个漂亮的文件中正确地构建一个匹配节点包 API 的声明文件?
编辑: 我没有使用 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
这就是我构建有用的东西的方法
- 按原样单独构建js库。
- 从输出中删除所有
///<reference ...
个标签
- 从模板构建类型定义文件
- 按原样构建定义文件
- 将它们全部连接到一个文件中
- 从输出中删除所有
///<reference ...
标签和 import
- 将输出条目插入模板
index.tmpl.d.ts
文件
- 将
declare export ...
替换为export ...
我是 Javascript、Node 和 Typescript 的新手,正在努力使用它们。
TL;DR
- 我们如何使用 Typescript 正确构建节点包?
- 我们如何在一个漂亮的文件中正确地构建一个匹配节点包 API 的声明文件?
这是我的故事:
我想使用 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'));
});
这是我得到的:
- 3 个声明文件:
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');
}
- 3 javascript 个文件:
foo.js
和 impl.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,但似乎没有任何东西能产生我想要的东西。
你能给我解释一下吗:
- 我们如何使用 Typescript 正确构建节点包?
- 我们如何在一个漂亮的文件中正确地构建一个匹配节点包 API 的声明文件?
编辑: 我没有使用 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
这就是我构建有用的东西的方法
- 按原样单独构建js库。
- 从输出中删除所有
///<reference ...
个标签
- 从输出中删除所有
- 从模板构建类型定义文件
- 按原样构建定义文件
- 将它们全部连接到一个文件中
- 从输出中删除所有
///<reference ...
标签和import
- 将输出条目插入模板
index.tmpl.d.ts
文件 - 将
declare export ...
替换为export ...