日期:2014-05-16  浏览次数:20346 次

利用jsdoc和idea加速javascript开发(二)
在上一篇中我们看到了一些Intellij Idea对jsdoc的支持, 这篇我们继续看Idea对类型表达式, 类声明, 成员函数, 模板方法的支持.

4. 类型表达式

在上一篇的例子中我们看到可以用@param指定参数的类型, 用@return指定返回值的类型, 用@type指定变量的类型. 下面我们详细的介绍一下指定类型时的表达式可以是什么样子的.

首先类型表达是需要用两个花括号"{...}"包起来, 简单的表达式不用{}也可以, 但为了统一风格, 建议都用{}. 你在代码中对参数, 返回值, 变量的类型表达式写的越精确, 越详细, IDEA对js的支持就越好.

类型名
指定类型的最简单方式
  • {boolean}
  • {Window}
  • {goog.ui.Menu}


集合类型
类似于Java里的泛型, 指定元素的类型
  • {Array.<String>} 字符串数组
  • {Object.<String,Number>} 对象的key是字符串, 值是数值, 类似于Map


联合类型
指定类型是A或B
{(number|boolean)}

记录(Record)类型
相当于匿名类, 指定类型中应该有的属性及属性类型, 里面那层{}是语法的一部分
  • Array.<{length}> Array中的元素需要有一个length属性
  • {{myNum: number, myObject}} 指明, 一个对象有一个数值类型的myNum属性, 和一个任意类型的myObject属性


可为null的类型
指明一个类型为A或null, 其实所有的类型(除了function,number, string, boolean)默认都是可以为null的, 即便前面不加问号.
  • {?Number}
  • {?Shape}


不可为null的类型
指明一个类型为A并且不为null. function,number, string, boolean默认不可为null.
  • {!Object}


函数类型
指明一个对象是函数, 并指明参数类型
  • {function(string, boolean)}


函数返回类型
指明一个对象是函数, 并指明返回值类型(也可以同时指明参数)
  • {function(): number}
  • {function(string, boolean): number}



函数中this的类型
指明一个对象是函数,并且在函数的context中this指向什么类型
  • {function(this:goog.ui.Menu, string)}


例如下面的例子:

/**
 *
 * @param {function(this:HTMLTableElement, Number)} f
 * @param {String} otherData
 */
var doSomething5 = function(f, otherData){

};


在调用doSomething5方法的匿名函数时, 首先我们可以看到函数声明提示



函数中的num变量被识别出是Number类型



函数中的this被识别出是HTMLTableElement



这里面我没有用自定义类型作为this的类型是因为我用IDEA 13.1.2中是乎不支持自定义类型, 不知道是不是Bug

函数中被new出来的类型
指明一个对象是函数,如果在这个函数前用new,会被创造出来的对象的类型
  • {function(new:goog.ui.Menu, string)} var menu = new func("str");

很遗憾, IDEA是乎没有找到相关的支持

可变长度的参数的类型
指明某一个参数的个数不定
  • {function(string, ...[number]): number} 第一个参数是string, 后面可以任何个Number类型的参数


/**
 *
 * @param {function(string, ...[number])} f
 * @param {String} otherData
 */
var doSomething7 = function(f, otherData){
    f("terry");
    f("terry", 1);
    f("terry", 1, 2, 3);
    f("terry", 1, 2, 3, 4);
};




可变长度的参数的类型 (@param)
指明某一个参数的个数不定
  • @param {...number} var_args 可以任何个Number类型的参数


/**
 *
 * @param {...number} args
 */
var doSomething8 = function (args) {

};


调用参数值类型不正确是会有提示



可选参数的类型
指明某一个参数是可选的
  • @param {number=} opt_argument


/**
 *
 * @param {Number} age
 * @param {String=} name
 */
var doSomething9 = function (age, name) {

};




任意类型
{*}

不确定类型
{?}
IDEA没有特殊支持

5. 类声明

定义接口和实现

总所周知,JavaScript是没有比较完善的面向对象支持, 所以从语言层面是实现接口和实现是比较困