Typescript非常好用,类型提示也非常棒,但是有的时候,必须只能使用js,所以我们使用jsdoc来对js代码进行注释,也能获得一些类型帮助
通用的JSDoc
基础类型
类型其实就是ts的类型,常见以下类型
boolean
布尔类型string
字符串类型number
数字类型xxx[]
或Array<xxx>
数组类型any
任意类型unknown
未知的任意类型void
无返回undefined
undefined类型null
null类型Never
从不存在
以下是使用案例代码
/** @type {boolean} 一个布尔值 */
var a = true
/** @type {string} 字符串值 */
var b = ''
/** @type {number} 数字类型 */
var c = 1
/** @type {number[]} 数字数组 */
var d = [1,2,3,4]
/** @type {any} 任意类型 */
var e = {a:true,b:'',c:1}
/**
* 一个示例函数f
* @param {unknown} a 未知类型的参数
* @returns {null} 返回值为null
*/
var f = (a)=>null
/**
* 一个示例函数g
* @returns {void} 没有返回值
*/
var g = ()=>{ console.log(0) }
其他常见类型
其他一些相对特殊一点的类型
- 函数类型: 例如
(a:number,b:number)=>number
- 对象类型: 例如
{[key:string]:any}
- 复合类型: 例如
'1'|'2'|'3'
/** @type {(a:number,b:number)=>number} 求和方法 */
var a;
a = (num1,num2)=>num1+num2
/**
* 求和
* @param {number} num1 被加数
* @param {number} num2 加数
* @returns {number} 和
*/
var b = (num1,num2)=>num1+num2
/** @type 不知道类型的 */
var c = {}
/**
* 获取对应状态的标题
* @param {1|2|3} state 状态
* @returns {'新建'|'编辑'|'详情'} 返回的标题
*/
var getTitle=(state)=>{
if(state===0){
return '新建'
}
if(state===1){
return '编辑'
}
if(state===2){
return '详情'
}
}
interface的替代写法
interface是ts中的接口,可以简单的理解为就是对象的类型
a.ts文件
/** 自定义接口Obj */
export interface Obj {
/** 布尔值类型a */
a:boolean;
/** 字符串类型b */
b:string;
/** 可选的数字类型c */
c?:number;
}
a.js文件
/**
* @typedef Obj 自定义接口Obj
* @property {boolean} a 布尔值类型a
* @property {string} b 字符串类型b
* @property {number=} c 可选的数字类型c
*/
/** @type {Obj} 某个对象 */
var obj = {a:true,b:'',c:1}
b.js文件
/** @type {import('./a.js').Obj} 某个对象 */
var obj2 = {a:false,b:'bbb'}
/** @type {import('./a.ts').Obj} 某个对象 */
var obj3 = {a:false,b:'ccc',c:2}
泛型
/**
* @template T
* @typedef ABC<T=any> 类型abc
* @property {string} a 字符串a
* @property {number=} b 数字b
* @property {T[]=} c 任意数组c
*/
/** @type {ABC<number>} 某个对象abc */
export var abc = {
a:'1',
b:1,
c:[1]
}
/**
* @template T
* @callback ForEachCallBack 遍历
* @param {number} key 数组的序号
* @param {T} value 数组的值
* @returns {void}
*/
/**
* 显示单位
* @template T
* @param {T[]} arr 求和
* @param {ForEachCallBack<T>} callback 计量单位字符串
*/
var forEach=(arr,callback)=>{
var len = arr.length;
for(var i=0;i<len;i+=1){
callback&&callback(i,arr[i])
}
}
forEach([1,2,3],function(key,val){
console.log(key,val)
})
几种特殊关键词
ts还提供几个特殊的关键词
- keyof
- typeof
var obj = {a:true,b:'',c:1}
/** @type { keyof typeof obj } */
var key = 'a' // 类型只能是 "a" | "b" | "c"
几个ts提供的泛型
ts提供的几个类型,可以在jsdoc中,使用
- Partial
部分类型 - Required
部分类型的对立面 - Readonly
只读类型 - Record<Keys,Type> 约束对象的值
- Pick<Type, Keys> 需要对象中指定的部分
- Omit<Type, Keys> 需要对象中,除指定之外的部分
- Exclude<Type, ExcludedUnion> 排除后面中存在的类型
- Extract<Type, Union> 只要后面中存在的类型
- NonNullable
排除null、undefined - Parameters
获取函数的参数类型
针对vue的注释
vue单文件,只是一个普通对象,针对几个特殊的属性,需要特殊注释
import { PropType } from 'vue'
/**
* @typedef Obj 自定义接口Obj
* @property {boolean} a 布尔值类型a
* @property {string} b 字符串类型b
* @property {number=} c 可选的数字类型c
*/
export default {
prop:{
/** @type {PropType<Obj>} 某个传入变量 */
abc:{
type:Object,
default:()=>({})
}
},
computed:{
/** @returns {number} 计算后的数值 */
ccc(){
return this.abc.c + 1
}
},
data(){
return {}
}
}
对于vuex的计算属性的注释,暂时无解
注释符号的建议
/** */
: 用于变量的注释
/* */
: 用于普通的多行注释
//
: 单行的业务逻辑注释
// TODO
: 打算做,还还未作的注释
总结
js中的类型注释,没有ts那么丰富,但是大部分的类型注释都是可以有的,为了提高代码的可读性,建议进行注释