利用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的, 即便前面不加问号.
不可为null的类型指明一个类型为A并且不为null. function,number, string, boolean默认不可为null.
函数类型指明一个对象是函数, 并指明参数类型
- {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是没有比较完善的面向对象支持, 所以从语言层面是实现接口和实现是比较困