精品欧美一区二区三区在线观看 _久久久久国色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)

樱桃视频成人在线观看| 国产精品高清无码| 香蕉精品久久| 欧美日韩精品免费| 日韩人妻无码精品久久久不卡| 性高潮久久久久久久久久| 日韩在线卡一卡二| 久久99视频精品| 男女做爰猛烈刺激| 99国产精品免费网站| 色婷婷av一区二区| 日韩a级黄色片| 成年人免费在线视频| 国产成人免费视频| 国产精品美女久久| 亚欧视频在线观看| 欧美va天堂在线| 国产香蕉一区二区三区在线视频| 国产精九九网站漫画| 欧美jizz18| 欧美午夜www高清视频| 日本中文字幕一级片| 搞黄视频免费在线观看| 成人av电影免费在线播放| 国产精品主播视频| 欧美人一级淫片a免费播放| 亚洲第一精品影视| 美女黄色丝袜一区| 国产福利在线导航| 精品日韩在线| 精品国产成人系列| 午夜激情视频网| 日韩免费大片| 欧美在线观看视频一区二区| 黄色免费视频大全| 白浆在线视频| 精品久久久久久久中文字幕| www插插插无码视频网站| 国产在线观看免费麻豆| 国产精品欧美久久久久一区二区| 欧美自拍资源在线| 久热av在线| 26uuu欧美| 欧美精品亚洲精品| 青青久草在线| 91色porny| 欧美二区三区在线| 天堂中文在线8| 99久久99久久久精品齐齐| 国产乱码精品一区二区三区不卡| 亚洲精品一区二区三区四区| 国产精品综合二区| 99在线视频免费观看| 午夜精品久久久久久久99老熟妇| 国产成人精品免费网站| 51午夜精品| 亚洲成人av综合| 成人精品视频.| 国产伦精品一区二区三区四区免费 | 亚洲精品免费av| 国产成人精品一区二三区四区五区| 国模一区二区三区白浆| 96久久精品| 亚洲精品久久久狠狠狠爱| 成人av网站免费观看| 欧美高清性xxxxhd| 成人免费在线电影| 一区免费观看视频| 无码人妻精品一区二区蜜桃网站| 免费男女羞羞的视频网站在线观看| 亚洲一区二区三区在线看| 欧美激情 国产精品| 精品91久久| 欧美喷潮久久久xxxxx| 亚洲国产综合av| 美女呻吟一区| 在线性视频日韩欧美| 9999热视频| 国产亚洲永久域名| 国产精品影片在线观看| 国产丰满美女做爰| 91视频观看视频| 亚洲三区四区| 伦理av在线| 91国产免费观看| 毛片毛片毛片毛片毛| 色爱综合av| 另类视频在线观看| 亚洲影院在线播放| 狠狠色综合播放一区二区| 国产欧美一区二区在线播放| 国产区高清在线| 夜夜爽夜夜爽精品视频| 50路60路老熟妇啪啪| 久久99精品久久久野外观看| 亚洲精品国产精品自产a区红杏吧| 舐め犯し波多野结衣在线观看| 欧美成人精品一区二区三区在线看| 欧美多人爱爱视频网站| 天天爽夜夜爽人人爽| 国产精品一区二区三区四区| 蜜桃传媒视频麻豆第一区免费观看 | 亚洲猫色日本管| 虎白女粉嫩尤物福利视频| 高清一区二区| 色一区av在线| 国产福利拍拍拍| 国产精品一色哟哟哟| 日韩一区二区三区高清| 波多野结衣精品| 欧美巨大另类极品videosbest| 超碰97在线资源站| 欧美搞黄网站| 成人福利在线视频| 国产美女视频一区二区三区 | 久久久综合网站| 国产乱人伦精品一区二区三区| 一区二区视频免费完整版观看| 欧美精品一区二区三区蜜桃 | 精品欧美国产一区二区三区| 涩涩网站在线看| 国模精品一区| 亚洲欧美日韩在线观看a三区| 日韩在线观看视频免费| 日韩大片免费在线观看| 国产呦精品一区二区三区网站| 欧美日韩一区二区三区在线视频 | 国产乱码精品一区二区亚洲| 免费成人高清在线视频theav| 亚洲国产欧美一区二区三区久久| 久久精品亚洲a| 日本午夜精品一区二区三区电影| 久久99精品国产一区二区三区| 污视频在线免费观看网站| 欧美日韩高清一区| 少妇愉情理伦三级| 奶水喷射视频一区| 久久久久久九九| 成人免费观看在线观看| 精品久久久久久无| 欧美日韩国产精品一区二区三区 | 婷婷中文字幕综合| 欧美做受高潮中文字幕| 国产精品久久| 国产偷国产偷亚洲高清97cao| 中文字幕免费高清电视剧网站在线观看 | 国产乱子伦农村叉叉叉| 国产三级精品三级在线观看国产| 欧美麻豆久久久久久中文| 精品人妻久久久久一区二区三区 | 中文字幕亚洲欧美日韩高清| 五月天中文字幕| 国产精品伦理在线| 中文字幕中文在线| 欧美韩日精品| 91精品国自产在线观看| 青草视频在线免费直播| 亚洲护士老师的毛茸茸最新章节| 久久精品人妻一区二区三区| www.日韩大片| 亚洲中文字幕久久精品无码喷水| 怕怕欧美视频免费大全| 国产精品影院在线观看| www视频在线免费观看| 精品国产亚洲一区二区三区在线观看| 懂色av.com| 久久久久久9999| 日韩av片专区| 欧美三区不卡| 麻豆久久久9性大片| 福利一区二区三区视频在线观看| 久久久精品国产亚洲| www.国产三级| 色综合久久中文综合久久牛| 国产又粗又猛又爽又黄的视频四季 | 亚洲综合大片69999| 国产www视频在线观看| 亚洲另类图片色| 在线不卡免费视频| 亚洲午夜影视影院在线观看| 97伦伦午夜电影理伦片| 久久精品国产精品亚洲红杏| youjizz.com在线观看| 亚洲国产欧美日韩在线观看第一区| 国产精品美女久久久免费| 18+视频在线观看| 亚洲人午夜精品| 国产美女永久免费| 富二代精品短视频| 亚洲熟女毛茸茸| 99久久精品免费看国产| 波多结衣在线观看| 影音先锋久久资源网| 视频一区二区三| 成人精品毛片| 国产美女直播视频一区| 国产无遮挡裸体视频在线观看| 在线丨暗呦小u女国产精品| 日本激情一区二区| 欧美一区二区三区电影| 99re这里只有精品在线| 洋洋av久久久久久久一区| 欧美肉大捧一进一出免费视频| 精品无人码麻豆乱码1区2区| 国产成人无码a区在线观看视频| 久久国产亚洲| 免费亚洲精品视频| 97超碰成人| 96pao国产成视频永久免费| 亚洲欧美韩国| 久久全球大尺度高清视频| 久热国产在线| 一区二区欧美亚洲| 午夜av免费在线观看| 日韩精品一区二区三区在线| 在线观看免费视频a| 精品久久中文字幕久久av| 欧美成人三级视频| 一区在线播放视频| 超碰人人人人人人人| 久久婷婷国产综合国色天香| 师生出轨h灌满了1v1| 国内一区二区在线| 天天爱天天操天天干| 媚黑女一区二区| 97超碰青青草| 国产日韩视频| 日本www在线播放| 99精品热6080yy久久| 日韩精品一区二区免费| 女生裸体视频一区二区三区| 一区二区三区视频| 日韩大片在线| 亚洲欧美在线网| 成人3d动漫在线观看| 欧洲精品码一区二区三区免费看| 神马久久影院| 欧美在线视频二区| 国内精品伊人久久久| 日韩国产欧美一区| 欧美限制电影| 亚洲一区二区三区在线观看视频| 精品理论电影在线| 亚洲免费视频一区| 国产精品久久久久久久免费观看 | 水蜜桃一区二区| 日韩欧美网址| 特级黄色录像片| 综合五月婷婷| 欧美人成在线观看| 日韩午夜免费视频| 欧美三级午夜理伦三级| 久久久久久久波多野高潮日日| 99久久久无码国产精品6| 久久激情一区| 国产精品一区二区小说| 精品亚洲porn| 精品无码av一区二区三区不卡| 成人美女视频在线观看18| 亚洲av成人无码一二三在线观看| 91视频免费播放| 国产主播av在线| 亚洲欧美成人一区二区三区| 国产精品999久久久| 日韩欧美精品中文字幕| 中文字幕视频一区二区| 日韩一区二区三区视频| 色欲久久久天天天综合网| 亚洲老头同性xxxxx| 看女生喷水的网站在线观看| 久久久久久久国产精品视频| 国产精品迅雷| 91香蕉亚洲精品| 麻豆视频一区| 亚洲最新在线| 日韩亚洲国产欧美| 邪恶网站在线观看| 国产高清精品在线| 欧美大波大乳巨大乳| 亚洲品质自拍视频网站| 激情五月色婷婷| 欧美日韩成人激情| 亚洲精品综合网| 在线观看欧美视频| 欧美家庭影院| 日韩av片电影专区| 国产电影一区| 日本精品一区二区| 欧美99久久| 杨幂毛片午夜性生毛片| www.日韩大片| 欧美大片xxxx| 日韩欧美国产中文字幕| 不卡av中文字幕| 国产亚洲欧洲高清一区| bbw在线视频| 91亚洲精品在线| 蜜桃视频欧美| 国产黄色片免费在线观看| 六月婷婷色综合| 伊人网综合视频| 亚洲免费电影在线| 波多野结衣网站| 亚洲精品成人久久久| 黄色av免费在线| 国产精品999999| 牛牛精品成人免费视频| 日本一区二区三区四区五区六区| 久久综合图片| 精品人妻伦一二三区久| 亚洲女同ⅹxx女同tv| 人人爽人人爽人人片av| 亚洲成人免费在线视频| www.久久久久.com| 国产欧美精品在线| 狠狠色丁香婷婷综合影院| 国产深夜男女无套内射| 国产精品一区二区三区乱码| 一级片黄色录像| 日韩欧美国产成人| 天堂成人在线视频| 久久久久久久影院| 亚洲精品不卡在线观看| 裸体裸乳免费看| 极品少妇一区二区| 美国美女黄色片| 日本韩国精品一区二区在线观看| 五月激情婷婷网| 91精品国产高清| 噜噜噜天天躁狠狠躁夜夜精品| 黄色一级片国产| 国产一区 二区 三区一级| 国产亚洲精品久久久久久豆腐| 91国产精品成人| 成人综合影院| 国产精品网红福利| 日韩毛片视频| 久久久久国产一区| 中文字幕第一页久久| 中文字幕av无码一区二区三区| 亚洲无亚洲人成网站77777| 国产成人精品123区免费视频| 你懂的视频在线一区二区| 免费日韩av| 国产熟妇久久777777| 在线看日本不卡| h视频在线观看免费| 国产日产欧美a一级在线| 99久久99久久精品国产片桃花 | 国产欧美日韩三区| 亚洲性猛交富婆| 久久精品国产成人精品| 欧州一区二区三区| 日韩av中文字幕第一页| 99久久综合狠狠综合久久| 亚洲视频 欧美视频| 在线视频免费一区二区| 伊人亚洲精品| 欧美日韩福利在线| 91美女片黄在线| 成人a v视频| 久热精品视频在线| 国产精品主播在线观看| 日本黄网站免费| 国产精品久久一卡二卡| 亚洲xxxx天美| 日本久久亚洲电影| 中文精品电影| 国产精品久久不卡| 欧美亚洲日本国产| 日韩av官网| 免费日韩av电影| 国产乱淫av一区二区三区| 日韩免费一级片| 综合久久五月天| 成人av动漫| 无人在线观看的免费高清视频 | 国产伦理精品| 国产一区二区三区奇米久涩| 午夜在线精品偷拍| 少妇视频一区二区| 精品黑人一区二区三区久久| xxx欧美xxx| 欧美日韩一级在线| av电影一区二区| 国产精品国产三级国产aⅴ| 国语自产偷拍精品视频偷 | 自拍偷拍欧美激情| 免费一级肉体全黄毛片| 国产丝袜一区二区| 国产精品一区二区精品视频观看| 青青在线免费观看| 国产精品久久久久永久免费观看 | 中文字幕亚洲第一| 国产日韩三级| 激情久久综合网| 在线观看亚洲一区| 牛牛精品一区二区| 今天免费高清在线观看国语| 欧美国产一区二区|