[Node.js] 使用TypeScript编写Node项目

原文地址:http://www.moye.me/2015/04/25/using_typescript/

入 TypeScript 坑有一段时间了,由衷的看好,所以决定在自留地絮叨一番。

是什么

TypeScript (以下简称TS)是巨硬推出的JavaScript转译语言,这意味着:

  1. 它需要编译
  2. TS代码会被编译成JavaScript代码

TS的特点是提供 模块、类、接口等一系列类型概念,协助开发者在编译时就定位出一些传统JavaScript项目的运行时错误,以实现巨硬所谓的”Robust components”(值得一提的是,TS是大名鼎鼎的 Anders Hejlsberg 主导的项目。

为什么

JavaScript 一般被视为一种动态类型、弱类型的语言,它拥有巨大的灵活性。 如下所示,类型的变化并不受约束:

var x = 10;
console.log(typeof x);  // result -> number
x = ‘hello‘;
console.log(typeof x);  // result -> string

那么TS引入的类型概念,又为哪般呢?来看一个示例:

我有一个求和的函数

function sum(x, y){
    return x + y;
}

但是你也可以这么用,JavaScript没有意见,虽然结果不合理:

sum(100, ‘hello‘); // result -> 100hello

于是,我们用TS这样的限定,保证以上调用是通不过编译的(输入都是number,返回也必须是number:

function sum(x:number, y:number):number {
    return x + y;
}

因为我们坚信,对一个数字和一个字符串进行求和,不是一种理智的需求——且,sum这时求和的结果是可信的了。

类示例

在 Node 中,因为流和事件机制的强大,很多时候我们都会让自己的类去继承 events.EventEmitter,JS代码看起来就像是这样:

var events = require(‘events‘);
var util = require(‘util‘);

function MyClass(){
   events.EventEmitter.call(this);
}

util.inherits(MyClass, events.EventEmitter);

如果你熟悉Node的一套理论,倒也还好,但其实用TS,能写出更优雅的代码:

import events = require(‘events‘);
import util = require(‘util‘);

export class MyClass extends events.EventEmitter{
    constructor(){
        super();
    }
}

具体的语法规范这里不做解释,有兴趣的可以参考官方的 Specification

这里想说的是,TS生成的JS代码质量很高,上述片断生成的代码(闭包防污染也考虑到了:

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var events = require(‘events‘);
var MyClass = (function (_super) {
    __extends(MyClass, _super);
    function MyClass() {
        _super.call(this);
    }
    return MyClass;
})(events.EventEmitter);
exports.MyClass = MyClass;

在WebStrom中使用

鄙人已退 Windows 开发保平安,也就只能说说WebStorm的使用问题了:

首先,你得有一个TS编译器 

npm install -g typescript

然后,在第一次新建.ts文件的时候,WebStorm会询问是否为.ts文件添加watcher,这样在文件有保存动作时,watcher会自动调用编译器去编译&生成——我的选项是“否”:稍微一点的项目都会使用Grunt/Gulp之类的自动化构建工具,编译也就会纳入为构建的一份子,那么以Grunt为例,编译这事交给 grunt-ts 就再合理不过了。grunt-ts配置示例:

ts: {
    default: {
        src: [‘**/*.ts‘, ‘!node_modules/**/*.ts‘],
        target: ‘es5‘,
        outDir: ‘/repo/releases‘,
        options: {
            fast: "never",
            module: "commonjs",
            sourceMap: false,
            suppressImplicitAnyIndexErrors: true,
            preserveConstEnums: true
        }
    }
}

TS 在对待import require的库时,有它自己的一套理论:它需要一个.d.ts文件来说明引用库的Schema,比如引用underscore:

import underscore = require(‘underscore‘);

那么在项目中,需要存在一个 underscore.d.ts,其中声明这么一句(完整示例请参考underscore.d.ts

declare module "underscore" {
	export = _; //...
}

然后在引用的地方声明一个.d.ts,引入:

///<reference path="underscore.d.ts"/>

如此一来,方可正确通过编译,亦能得到WebStorm的智能提示。当然,如果不爽这种麻烦的引用,也可以不用import,直接使用如下形式来跳过TS检查:

var underscore = require(‘underscore‘);

一般而言,知名的第三方库,都能在 DefinitelyTyped 项目中找到 .d.ts,而WebStorm亦提供了快捷引用方式:

Preferences -> Languages & Frameworks -> Libraries -> Downloads… -> TypeScript community stubs,选你所需 Download & Install:

参考

  1. TypeScript Handbook:online version

更多文章请移步我的blog新地址: http://www.moye.me/

时间: 2024-10-11 22:38:27

[Node.js] 使用TypeScript编写Node项目的相关文章

J2EE实战视频教程:基于LigerUI+JBPM5+Node.js的J2EE大型金融项目

基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录适合人群:初级课时数量:150课时用到技术: nodejs SSH jscharts LigerUI Jpbm5.4涉及项目:实际金融行业项目咨询qq:1840215592 针对岗位:Java高级软件开发工程师,金融行业开发工程师, JBPM工作流开发工程师,Node.js开发工程师.课程简介:本课程系讲师在实际金融行业工作中的一真实项目,除简化了部分业务逻辑外,基础架构及核心模块超均来自

Node.js C++ addon编写实战(一)之node-gyp

http://deadhorse.me/nodejs/2012/10/08/c_addon_in_nodejs_node_gyp.html 这是一个三篇的系列文章,记录Node.js C++扩展开发中的一些经验与坑.Node.js C++ addon编写实战(一)之node-gypNode.js C++ addon编写实战(二)之对象转换Node.js C++ addon编写实战(三)之Buffer 补上第四篇:Node.js C++ addon编写实战(四)之兼容v0.11+与nan模块 从n

基于ligerUI+jbpm5自定义表单+Node.js的J2ee大型金融项目《财务预算系统》开发全程实录

基于ligerUI+jbpm5自定义表单+Node.js的J2ee大型金融项目<财务预算系统>开发全程实录 对这个课程感兴趣的可以加我雾非雾QQ2748165793, 讲师介绍: 3年对日外包电信行业软件专家,六年项目开发经验,二年高端培训机构教学管理经验,惠普全球研发中心骨干.现任北风金牌合作讲师. 项目经验丰富: 日本电信NTT DATA SYSTEM 日本航空ANA SYSTEM 日本TAHOO BB 在线信息平台 惠普DDC--InternalManagement SYSTEM(内部管

下载基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目《财务预算系统》开发全程实录

基于LigerUI+JBPM5自定义表单+Node.js的J2EE大型金融项目<财务预算系统>开发全程实录 地址:http://pan.baidu.com/s/1eRBSHGY 密码:q8x8 课程分为三季:第一季:基础篇,主要内容包括:基础设置,主要是对整个框架的搭建,对流程的控制,对所用到的技术进行基础讲解.第二季:中级篇,主要内容包括:预算编制及预算调整,主要将第一部分所用到的技术知识进行深化,以及对业务的讲解.第三季:高级篇,主要内容包括:预算执行及报表分析,主要是完成整个项目的业务流

node.js使用Koa搭建基础项目

Koa 是由 Express 原班人马打造的超轻量服务端框架 与 Express 相比,除了自由度更高,可以自行引入中间件之外,更重要的是使用了 ES6 + async,从而避免了回调地狱 不过也是因为代码升级,所以 Koa2 需要 v7.60 以上的 node.js 环境 一.创建项目 1.手动创建一个项目目录,然后快速生成一个 package.json 文件 $ npm init -y 安装 koa    //当前版本 2.4.1 $ npm install koa -s 然后创建一个 ap

Node.js的安装以及Node.js的模块管理

索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Element)的使用 一:Node.js正确写法 在很久以前,写过一篇 jQuery插件定义 的博客,给我留下了深刻的印象.当时本意是讨论jQuery插件的标准化定义,引出了jQuery写法的问题. jQuery写法是千变万化:Jquery,jquery,JQUERY,JQuery.好些人都没留意这个写法的

node.js高级编程|node.js 视频教程_基于node.js+Express.js+Jade+MongoDB实战开发

基于node.js+Express.js+Jade+MongoDB开发Web即时聊天系统课程讲师:幻星课程分类:前端开发适合人群:初级课时数量:36课时更新程度:完成用到技术:Node.js NPM. Express.NoSQL,MongoDB涉及项目:匿名聊天网站系统node.js视频教程:http://www.ibeifeng.com/goods-462.htmlnode.js 教程适合人群:node.js视频教程要求学员了解JavaScript,node.js入门教程适合希望更深入的学习N

node.js入门系列(一)--Node.js简介

什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS就相应提供了fs.

探秘Node.js(一)——Node.js简介及安装配置

1.Node.js 简介及特点: Node.js 是一个可以让 JavaScript 运行在服务器端的平台,它可以让JavaScript 脱离浏览器的束缚运行在一般的服务器环境下,就像运行 Python. Perl. PHP. Ruby 程序一样.我们可以用 Node.js 轻松地进行服务器端应用开发,Python. Perl. PHP. Ruby 能做的事 Node.js 几乎都能做,而且可以做得更好. Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计.对于高并发的解决方