精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端開發(fā)利器Jsdoc:讓我們像寫Typescript一樣寫JavaScript

開發(fā) 前端
有沒有一種不用Typescript的解決方案呢?有,那就是今天的主角:Jsdoc;這可能是一個(gè)大家很少使用的開發(fā)利器;它是一個(gè)可以使你像寫Typescript一樣寫JavaScript;沒錯(cuò),Jsdoc主要就是用來(lái)給js添加類型信息的。

眾所周知的原因,由于JS的語(yǔ)言特性,任何開發(fā)工具都不能為JS提供足夠好的智能提示,正因?yàn)榇耍④泟?chuàng)造的輪子:typescript,橫空出世!

那么,有沒有一種不用typescript的解決方案呢?有,那就是今天的主角:jsdoc;這可能是一個(gè)大家很少使用的開發(fā)利器;它是一個(gè)可以使你像寫typescript一樣寫JavaScript;沒錯(cuò),jsdoc主要就是用來(lái)給js添加類型信息的。

下面我們看一個(gè)簡(jiǎn)單的函數(shù),這個(gè)函數(shù)接收一個(gè)參數(shù)modalElement,由于編輯器不知道它是什么類型,所以在調(diào)用它的querySelector方法的時(shí)候,無(wú)法獲得編輯器的智能提示;同樣地,編輯器也無(wú)法給出btnClose的click方法的智能提示。

const closeModal = modalElement => {
if (modalElement) {
const btnClose = modalElement.querySelector('.el-dialog__close')
if (btnClose) {
btnClose.click()
return true
}
}
}

這時(shí)候,就該jsdoc出場(chǎng)了;它的語(yǔ)法需要寫在多行注釋中,因?yàn)樗粚儆趈s語(yǔ)法的一部分;我們只需給modalElement和btnClose增加一個(gè)類型標(biāo)注,編輯器就知道它們是什么類型,擁有什么能力了;

為函數(shù)參數(shù)指定類型,使用@param標(biāo)記,語(yǔ)法:@param {類型} 參數(shù)名;為變量指定類型,使用@type標(biāo)記,語(yǔ)法:@type {類型};代碼如下:

/** @param {HTMLDivElement} modalElement */
const closeModal = modalElement => {
if (modalElement) {
/** @type {HTMLLinkElement} */
const btnClose = modalElement.querySelector('.el-dialog__close')
if (btnClose) {
btnClose.click()
return true
}
}
}

現(xiàn)在,當(dāng)我們把指針移入modalElement的時(shí)候,就不是一個(gè)簡(jiǎn)單的any類型了,編輯器可以根據(jù)文檔注釋確定它是HTMLDivElement類型,我們?cè)谡{(diào)用它的querySelector方法的時(shí)候就能得到編輯器的智能提示;當(dāng)我們把指針移入click的時(shí)候,編輯器告訴我們,這個(gè)方法是從HTMLElement繼承來(lái)的。

@returns標(biāo)注用于指定函數(shù)返回值數(shù)據(jù)類型;語(yǔ)法:@returns {類型};如下函數(shù)返回由HTMLDivElement構(gòu)成的數(shù)組。

/** @returns {HTMLDivElement[]} */
const getAllModals = () => {
return Array.from(
document.body.querySelectorAll('.el-dialog__wrapper, .el-drawer__wrapper')
).filter(_ => {
return window.getComputedStyle(_, null).display !== 'none'
})
}

如下圖,當(dāng)我們調(diào)用getAllModals函數(shù)返回值的reduce方法的時(shí)候,編輯器可以給出智能提示。

我們還可以使用@typedef標(biāo)記自定義類型;語(yǔ)法:import('模塊路徑'),用于從模塊中導(dǎo)入TS類型定義;&符號(hào)用于合并2個(gè)類型;如下例子定義了一個(gè)名叫RouteConfig的類型,該類型在import('vue-router').RouteConfig的基礎(chǔ)上為meta字段增加了number類型的index字段。

/**
* @typedef {import('vue-router').RouteConfig & {meta: { index: number }}} RouteConfig
*/

如下例子定義了一個(gè)EntAccountInfo類型,包含2個(gè)字段:數(shù)值類型的id和字符串類型的password。

/**
* @typedef {{id: number, password: string}} EntAccountInfo
*/

如果我們的字段比較多,可以使用@property標(biāo)記定義每個(gè)字段。

/**
* @typedef UserData 用戶數(shù)據(jù)
* @property {any} entid 租戶id
* @property {string} name 姓名
* @property {string} workNo 工號(hào)
* @property {string} userId 用戶id
* @property {string} username 登錄用戶名
*/

我們自定義的類型和內(nèi)置類型用法完全一樣;請(qǐng)看下面例子,包含內(nèi)置類型和我們上面創(chuàng)建的自定義類型;我們?cè)诮o對(duì)象字段指定類型的時(shí)候,可以有2種寫法:寫在字段名前面或上面;大家覺得哪種風(fēng)格優(yōu)雅?

export const state = Vue.observable({
/** @type {string[]} */ keeps: [],
/** @type {RouteConfig[]} */ menus: [],
/** @type {EntAccountInfo} */ entInfo: {},
/** @type {UserData} */ userData: {},
})
export const state = Vue.observable({
/** @type {string[]} */
keeps: [],
/** @type {RouteConfig[]} */
menus: [],
/** @type {EntAccountInfo} */
entInfo: {},
/** @type {UserData} */
userData: {}
})

我們可以使用管道符為一個(gè)變量指定多個(gè)可能的類型,請(qǐng)看如下例子,當(dāng)用戶調(diào)用該函數(shù)的時(shí)候,編輯器會(huì)提示該函數(shù)期望接收一個(gè)類型為日期或字符串或數(shù)值的參數(shù)time。

/** @param {Date | string | number} time */
export const getHalfYearAfterTime = time => {
const date = new Date(time)
date.setMonth(date.getMonth() + 6)
date.setDate(date.getDate() - 1)
return date
}

如果我們的函數(shù)有不限個(gè)數(shù)的參數(shù),可以使用語(yǔ)法:@param {...類型} 參數(shù)名,指定參數(shù)類型;請(qǐng)看如下例子:

/** @param  {...string} paths */
export const getApiUrl = (...paths) => joinPath(API_BASE, ...paths)

不限參數(shù)個(gè)數(shù)的函數(shù),還有更高級(jí)的類型標(biāo)注寫法;請(qǐng)看如下代碼,formRequest是一個(gè)axios的實(shí)例,我們想每次發(fā)起post請(qǐng)求的時(shí)候少寫10來(lái)個(gè)字符,定義了一個(gè)post函數(shù),直接返回了對(duì)formRequest的post方法調(diào)用。

export const post = (...args) => formRequest.post(...args)

通過(guò)編輯器的提示,我們得知axios的post方法有3個(gè)不同類型的參數(shù);而我們?yōu)榱耸∈拢褂昧苏归_運(yùn)算符,不管傳入多少個(gè)參數(shù),全部仍給axios實(shí)例的post方法;那么,參數(shù)類型該如何標(biāo)注呢?

我們可以使用中括號(hào)語(yǔ)法為每個(gè)參數(shù)指定字段名和類型,例子如下:

/** @param  {[url: string, data?: any, config?: RequestConfig]} args */
export const post = (...args) => formRequest.post(...args)

下圖是當(dāng)指針移入post函數(shù)上時(shí),編輯器給出的提示;是不是很酷?

如下是RequestConfig的類型定義,我們擴(kuò)展了AxiosRequestConfig,為其增加了2個(gè)布爾類型字段;現(xiàn)在當(dāng)我們調(diào)用post函數(shù)的時(shí)候,編輯器就會(huì)知道我們的第3個(gè)參數(shù)config包含這2個(gè)布爾類型字段。

/**
* @typedef {import('axios').AxiosRequestConfig & { needAuth: boolean, saveToken: boolean }} RequestConfig
*/

jsdoc還可以定義泛型類型,語(yǔ)法:@template 泛型名;請(qǐng)看如下例子,TreeNode是一個(gè)泛型類型,我們唯一能確定的是它有一個(gè)children字段;它具體還包含哪些字段,由泛型T決定。

/**
* @template T
* @typedef {T & {children: TreeNode[]}} TreeNode
*/

我們還可以在函數(shù)類型標(biāo)注中使用泛型,請(qǐng)看如下例子,我們定義了一個(gè)泛型T,參數(shù)data為泛型T數(shù)組,返回值為泛型類型TreeNode<T>構(gòu)成的數(shù)組。

/**
* @template T
* @param {T[]} data
* @param {{key: string, parentId: string}} config
* @returns {TreeNode<T>[]}
*/
export const toTree = (data, config) => {
const { key = 'id', parentId: pId = 'parentId' } = config || {}
const ids = data.map(_ => _[key])
/** @type {TreeNode<T>[]} */
const result = []
// ... ...
return result
}

以上就是我工作中最常用的jsdoc用法,還有很多用法沒有涉及到;篇幅有限,大家可以去官網(wǎng)查看文檔;希望該文章能助大家的JS技術(shù)更上一層樓,感謝閱讀!

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-02-15 08:17:20

VSCodeTypeScrip

2023-05-23 13:59:41

RustPython程序

2023-08-09 09:03:25

Typescript工具Jsdoc

2022-10-12 08:05:04

PlantUML代碼運(yùn)行環(huán)境

2013-01-29 10:07:13

建筑設(shè)計(jì)師寫程序程序員

2012-03-21 10:15:48

RIM越獄

2023-03-06 09:20:53

扁平化管理代碼

2025-09-12 00:00:00

DevToolsJavaScript調(diào)試術(shù)

2015-02-05 13:27:02

移動(dòng)開發(fā)模塊SDK

2023-04-05 14:19:07

FlinkRedisNoSQL

2025-10-13 07:31:08

2013-12-17 09:02:03

Python調(diào)試

2013-12-31 09:19:23

Python調(diào)試

2022-12-21 15:56:23

代碼文檔工具

2017-11-07 10:09:39

Windows效率利器Everything

2017-03-15 16:17:20

學(xué)習(xí)命令計(jì)算機(jī)

2021-05-20 08:37:32

multiprocesPython線程

2013-08-22 10:17:51

Google大數(shù)據(jù)業(yè)務(wù)價(jià)值

2015-03-16 12:50:44

2012-06-08 13:47:32

Wndows 8Vista
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲第一男人天堂| 亚洲妇女屁股眼交7| 国产乱肥老妇国产一区二| 视频国产一区二区| 超碰97成人| 欧日韩精品视频| 五月天激情图片| 你懂的在线播放| 国产一区美女在线| 庆余年2免费日韩剧观看大牛| 337人体粉嫩噜噜噜| 在线日韩成人| 欧美日韩国产电影| 鲁一鲁一鲁一鲁一色| 老司机精品影院| 久久人人超碰精品| 成人国产一区二区| 亚洲综合网av| 日韩二区三区在线观看| 欧美精品电影在线| 人与动物性xxxx| 欧美亚洲国产日韩| 欧美一区二区三区免费在线看| 日本a级片免费观看| av毛片在线| 中文字幕国产一区二区| 久久精品国产99精品国产亚洲性色| 一本到在线视频| 久久成人在线| 亚州成人av在线| 强行糟蹋人妻hd中文| 秋霞欧美视频| 亚洲午夜性刺激影院| 亚洲熟妇一区二区| 欧美综合影院| 欧美亚一区二区| 日本三区在线观看| 久草免费在线视频| 亚洲高清视频中文字幕| 麻豆一区二区三区在线观看| www.亚洲视频| 国产午夜精品理论片a级大结局| 国产精品久久波多野结衣| 国产乱码久久久久| 黄色小说综合网站| 国产免费一区二区三区在线观看| 天堂网中文字幕| 国产精品一国产精品k频道56| 欧美精品免费在线| 精品国产精品国产精品| 欧美电影免费观看高清| 中文字幕在线亚洲| 欧美另类69xxxx| 日韩欧美二区| 中文字幕日韩免费视频| 黄色激情小视频| 日韩在线观看| 久久久精品美女| 懂色av懂色av粉嫩av| 夜间精品视频| 欧美华人在线视频| 日韩成年人视频| 国产精品日本| 国产ts人妖一区二区三区| 中文字幕一区二区人妻电影| 美女精品在线观看| 国产精品久久久久久久久久久久久| 福利网址在线观看| 欧美aaa在线| 成人国产亚洲精品a区天堂华泰| 国产精品久久影视| 国产一区不卡视频| 国产一区二区高清不卡| 青青久草在线| 亚洲欧洲日产国码二区| 日韩在线视频在线| 黄频免费在线观看| 在线免费观看日本欧美| 看看黄色一级片| 综合久久成人| 亚洲视频第一页| 少妇高潮在线观看| 尤物在线精品| 国产精品扒开腿做爽爽爽视频| 亚洲国产无线乱码在线观看| 久久草av在线| 国产伦精品一区二区三区视频免费| 手机看片一区二区三区| 欧美国产一区二区在线观看| 91手机视频在线| а√在线中文网新版地址在线| 色婷婷久久99综合精品jk白丝| 性刺激的欧美三级视频| 亚洲天堂中文字幕在线观看| 亚洲美女中文字幕| 爱爱视频免费在线观看| 校园激情久久| 亚洲xxxx18| 欧美香蕉爽爽人人爽| 成人欧美一区二区三区在线播放| 福利视频一二区| 国产精品亚洲成在人线| 亚洲精品成人av| 国产精品国产三级国产传播| 一区二区高清| 91日本视频在线| 九色视频在线观看免费播放| 一区二区三区日韩精品视频| caopor在线视频| 风间由美一区二区av101| 一本色道久久88亚洲综合88| 妺妺窝人体色www聚色窝仙踪| 久久久久网站| 国产一区不卡在线观看| 国产激情在线观看| 在线精品视频小说1| 精品久久久久一区二区| 国产韩国精品一区二区三区| 欧美一区二区三区……| 精品久久久久成人码免费动漫| 久久精品一区八戒影视| www..com日韩| 欧美另类中文字幕| 日韩一区二区在线视频| 亚洲成人第一网站| 99国产精品国产精品毛片| 91嫩草国产丨精品入口麻豆| 成人四虎影院| 亚洲欧美日韩国产中文| 日韩欧美一区二区一幕| 国产精品69久久久久水密桃| 一本久久a久久精品vr综合| 成人性生活视频| 精品视频久久久| 精品视频一区二区在线观看| 国产剧情av麻豆香蕉精品| 色一情一乱一伦一区二区三区 | 色777狠狠综合秋免鲁丝| 色网站在线播放| 成人黄色综合网站| 欧美日韩激情四射| 午夜免费欧美电影| 欧美日韩电影在线观看| 国产熟女精品视频| 亚洲色图欧美在线| 又色又爽又黄视频| 91精品婷婷色在线观看| 91精品免费久久久久久久久| 欧美精品hd| 69堂亚洲精品首页| 成人在线观看小视频| 国产主播一区二区三区| 综合视频免费看| av在线播放一区二区| 久久亚洲春色中文字幕| 国产人妖一区二区三区| 亚洲另类在线一区| 成年人小视频在线观看| 亚洲欧洲综合| 欧美日韩免费观看一区| 99re66热这里只有精品4| 色偷偷亚洲男人天堂| 一级黄色片在线播放| 亚洲人123区| 在线播放av网址| 一本色道精品久久一区二区三区 | 精品日韩一区| 国产精品吴梦梦| 成人影院www在线观看| 日韩欧美综合在线| 日韩欧美大片在线观看| 久久奇米777| 黄色小视频免费网站| 欧美在线日韩| 久久精品国产一区二区三区日韩| 国产精品一区二区av影院萌芽| 亚洲天堂av综合网| 国产精品久久婷婷| 婷婷久久综合九色综合绿巨人| 中文字幕一区二区三区人妻不卡| 丝袜亚洲另类欧美| 男人天堂成人网| 青青一区二区| 国产精品免费在线免费 | 色姑娘综合天天| 亚洲激情黄色| 午夜精品视频在线观看一区二区| av日韩久久| 日韩av电影手机在线| 黄色免费网站在线观看| 精品盗摄一区二区三区| 亚洲精品国产无码| 亚洲综合在线免费观看| 国产成人精品无码免费看夜聊软件| 美女一区二区三区在线观看| 波多野结衣av一区二区全免费观看| 校花撩起jk露出白色内裤国产精品| 国产精品福利小视频| 毛片网站在线看| 国产亚洲精品高潮| 免费看av毛片| 欧美日韩另类一区| 日韩不卡在线播放| 亚洲少妇中出一区| 日本丰满少妇裸体自慰| 国产精品综合视频| 亚欧在线免费观看| 亚洲精品孕妇| 国产日韩欧美大片| 日韩精品欧美激情一区二区| 精品国产免费久久久久久尖叫| 四虎精品一区二区免费| 日韩美女视频中文字幕| 免费电影网站在线视频观看福利| 国产午夜精品视频免费不卡69堂| 亚洲高清精品视频| 欧美日韩成人一区| 中文字幕精品视频在线观看| 亚洲国产精品一区二区www在线| 少妇一级黄色片| 久久五月婷婷丁香社区| 亚洲一级Av无码毛片久久精品| 美女爽到高潮91| 久久久久久久久久福利| 亚洲高清自拍| 伊人网在线免费| 四虎国产精品免费观看| 日本一区二区在线| 婷婷综合福利| 精品久久久久久综合日本| 午夜视频在线观看精品中文| 国产精品九九久久久久久久| 亚洲最大成人| 4388成人网| 免费在线小视频| 欧美激情视频在线| 性直播体位视频在线观看| 久久在线精品视频| 国产精品剧情一区二区在线观看| 最近2019好看的中文字幕免费| 日本福利在线观看| 亚洲欧美中文日韩v在线观看| 无码国产精品96久久久久| 精品国产乱码久久久久久蜜臀| 不卡av中文字幕| 精品国产乱码久久久久久牛牛 | 国产特黄大片aaaa毛片| 亚洲午夜激情网站| 国产一卡二卡在线| 亚洲成人免费视| 国产午夜在线播放| 精品美女永久免费视频| 欧美一区二区激情视频| 精品国产91久久久久久| 一级片中文字幕| 色欧美片视频在线观看| 五月婷婷丁香在线| 在线播放中文字幕一区| 91超薄丝袜肉丝一区二区| 91精品欧美久久久久久动漫| 99免费在线视频| 精品日产卡一卡二卡麻豆| 国内爆初菊对白视频| 日韩精品免费在线观看| 国产h在线观看| 久久亚洲私人国产精品va| 91最新在线视频| 97视频在线观看成人| 亚洲女同志freevdieo| 国产精品扒开腿做爽爽爽视频| 欧美91在线|欧美| av成人综合网| 日本天堂一区| 在线观看亚洲视频啊啊啊啊| 亚洲乱码精品| 日韩免费一级视频| 麻豆久久久久久| 激情小说欧美色图| 久久伊99综合婷婷久久伊| 青青操在线播放| 亚洲国产一二三| 无码人妻丰满熟妇区五十路| 在线91免费看| 午夜视频1000| 日韩在线观看视频免费| www.色在线| 成人国产精品免费视频| 欧美丝袜足交| av磁力番号网| 日韩电影在线免费观看| 亚欧美一区二区三区| 91亚洲国产成人精品一区二区三| 欧美激情视频二区| 天天综合网天天综合色| 91在线精品入口| 精品亚洲aⅴ在线观看| 国产成人午夜| 国产成人久久久| 一区二区三区在线免费看| 欧美一级二级三级九九九| 欧美高清日韩| 欧美大尺度做爰床戏| 成人毛片视频在线观看| 很污很黄的网站| 欧美日韩在线视频一区| 99精品久久久久久中文字幕| 亚洲欧美中文字幕在线一区| 亚洲奶水xxxx哺乳期| 国产精品视频专区| 亚洲裸色大胆大尺寸艺术写真| 中文字幕精品一区日韩| 亚欧成人精品| 成年女人免费视频| 综合激情成人伊人| 69视频免费看| 日韩电影大片中文字幕| 免费a级毛片在线播放| 日韩美女激情视频| 欧美毛片免费观看| 黄色片免费在线观看视频| 免费一区二区视频| 久久久久久九九九九九| 亚洲二区在线视频| 精品毛片在线观看| 久久精品亚洲94久久精品| 欧美日韩精品一区二区三区视频| 精品国产一区二区三区免费| 欧美高清一区| 亚洲一区二区三区三州| 中文字幕一区二区三中文字幕| 久久久久久无码午夜精品直播| 亚洲精品第一国产综合精品| 欧美bbbxxxxx| yellow视频在线观看一区二区| 偷偷www综合久久久久久久| 在线观看的毛片| 国产女人水真多18毛片18精品视频| 国产无人区码熟妇毛片多| 亚洲第一精品久久忘忧草社区| 日韩专区av| 国产精品伊人日日| 亚洲午夜电影| 在线看黄色的网站| 午夜伊人狠狠久久| 亚洲色大成网站www| 91国产精品视频在线| 日本妇女一区| 成年人视频在线免费| 久久久www成人免费毛片麻豆| 久久精品无码av| 亚洲午夜激情免费视频| 成人四虎影院| 久久精品国产精品亚洲精品色| 久久成人免费网| 午夜国产福利一区二区| 日韩欧美中文字幕一区| 福利成人导航| 久久久久久99| 久久午夜av| 三级黄色在线观看| 日韩亚洲国产中文字幕欧美| 免费毛片在线看片免费丝瓜视频 | 国产精彩精品视频| 成人aaaa| av在线免费观看不卡| 亚洲风情在线资源站| 九色视频在线观看免费播放| 国产玖玖精品视频| 国产精品观看| 青青草成人免费视频| 欧美三级午夜理伦三级中视频| 免费av在线网站| 国产精品加勒比| 日韩精品一二三四| 日本老熟俱乐部h0930| 亚洲激情免费观看| 91久久久久久白丝白浆欲热蜜臀| 在线播放豆国产99亚洲| 丁香激情综合国产| 97人妻一区二区精品视频| 日韩视频在线免费观看| av在线亚洲色图| 老头吃奶性行交视频| 日韩美女精品在线| 色婷婷中文字幕| 国产精品直播网红| 亚洲精品1区| 91动漫免费网站| 亚洲精品美女在线观看播放| 九九久久国产| 日韩小视频网站| 国产精品九色蝌蚪自拍| 特级丰满少妇一级aaaa爱毛片| 国产精品99久久99久久久二8| 一区二区三区四区电影| 亚洲精品乱码久久久久久不卡| 欧美日韩免费一区二区三区视频| 日本h片在线观看| 亚洲一卡二卡三卡| 99riav一区二区三区|