本篇內(nèi)容主要講解“TS面試題實例代碼分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“TS面試題實例代碼分析”吧!
創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十載品質(zhì),值得信賴!
第一層的要求是這樣的:
實現(xiàn)一個 zip 函數(shù),對兩個數(shù)組的元素按順序兩兩合并,比如輸入 [1,2,3], [4,5,6] 時,返回 [[1,4], [2,5],[3,6]]
這層就是每次各從兩個數(shù)組取一個元素,合并之后放到數(shù)組里,然后繼續(xù)處理下一個,遞歸進行這個流程,直到數(shù)組為空即可。
function zip(target, source) {
if (!target.length || !source.length) return [];
const [one, ...rest1] = target;
const [other, ...rest2] = source;
return [[one, other], ...zip(rest1, rest2)];
}
結(jié)果是對的:
第一層還是比較簡單的,然后我們來看第二層要求:
給這個 zip 函數(shù)定義 ts 類型(兩種寫法)
函數(shù)的定義有兩種形式:
直接通過 function 聲明函數(shù):
function func() {}
和聲明匿名函數(shù)然后賦值給變量:
const func = () => {}
而參數(shù)和返回值的類型都是數(shù)組,只是具體類型不知道,可以寫 unknown[]。
所以兩種函數(shù)類型的定義就是這樣的:
也是直接 function 聲明函數(shù)類型和 interface 聲明函數(shù)類型然后加到變量類型上兩種。
因為具體元素類型不知道,所以用 unknown。
這里可能會問 any 和 unknown 的區(qū)別:
any 和 unknown 都可以接收任何類型:
但是 any 也可以賦值給任何類型,但 unknown 不行。
這里只是用來接收其他類型, 所以 unknown 比any 更合適一些,更安全。
這一層也是比較基礎(chǔ)的 ts 語法,第三層就上了難度了:
用類型編程實現(xiàn)精確的類型提示,比如參數(shù)傳入 [1,2,3], [4,5,6],那返回值的類型要提示出 [[1,4], [2,5],[3,6]]
這里要求返回值類型是精確的,我們就要根據(jù)參數(shù)的類型來動態(tài)生成返回值類型。
也就是這樣:
聲明兩個類型參數(shù) Target、Source,約束為 unknown[],也就是元素類型任意的數(shù)組類型。
這倆類型參數(shù)分別是傳入的兩個參數(shù)的類型。
返回值通過 Zip 計算得出。
然后要實現(xiàn) Zip 的高級類型:
傳入的類型參數(shù)分別是兩個數(shù)組類型,我們同樣要從中提取出每個元素合并到一起。
提取元素可以用模式匹配的方式:
所以這個類型就可以這樣定義:
type Zip
分別提取兩個數(shù)組的第一個元素,構(gòu)造成新數(shù)組。然后對剩下的數(shù)組遞歸進行這樣的處理,直到數(shù)組為空。
這樣就實現(xiàn)了我們想要的高級類型:
但你把它作為返回值加到函數(shù)上會報錯:
因為聲明函數(shù)的時候都不知道參數(shù)是啥,自然計算不出 Zip
那怎么辦呢?
可以用函數(shù)重載解決:
ts 支持函數(shù)重載,可以寫多個同名函數(shù)的類型的類型定義,最后寫函數(shù)的實現(xiàn),這樣用到這個函數(shù)的時候會根據(jù)參數(shù)的類型來匹配函數(shù)類型。
我們用了類型編程的那個函數(shù)通過這種方式寫就不會報錯了。
我們使用下看看:
咋返回值的類型不對呢?
其實這時候匹配的函數(shù)類型是對的,只不過推導(dǎo)出的不是字面量類型。
這時候可以加個 as const。
但是加上 as const 會推導(dǎo)出 readonly [1,2,3]
這樣類型就不匹配了,所以要在類型參數(shù)的聲明上也加上 readonly:
但這樣 Zip 函數(shù)的類型又不匹配了。
難道要把所有用到這個類型的地方都加上 readonly 么?
不用,我們 readonly 的修飾去掉不就行了?
Typescript 有內(nèi)置的高級類型 readonly:
可以把索引類型的每個索引都加上 readonly 修飾:
但沒有提供去掉 readonly 修飾的高級類型,我們可以自己實現(xiàn)一下:
用映射類型的語法構(gòu)造個新索引類型,加上個 -readonly 就是去掉 readonly 修飾的意思。
有的同學(xué)可能問了,數(shù)組類型也是索引類型么?
是,索引類型是聚合多個元素的類型,所以對象、數(shù)組、class 都是。
所以我們把它用在數(shù)組上自然也是可以的:
(準(zhǔn)確來說叫元組,元組是元素個數(shù)固定的數(shù)組)
那我們只要在傳入 Zip 之前,用 Mutable 去掉 readonly 就可以了:
再來試一下:
大功告成!現(xiàn)在返回值的類型就對了。
但還有個問題,如果不是直接傳入字面量,是推導(dǎo)不出字面量類型的,這時候貌似就不對了:
可我們不都聲明重載類型了么?
如果推導(dǎo)不出字面量類型,應(yīng)該匹配這個呀:
但實際上它匹配的還是第一個:
這時候其實只要調(diào)換下兩個函數(shù)類型的順序就可以了:
這時字面量參數(shù)的情況依然也是對的:
為什么呢?
因為重載函數(shù)的類型是從上到下依次匹配,只要匹配到一個就應(yīng)用。
非字面量的情況,類型是 number[],能匹配 unknown[] 的那個類型,所以那個函數(shù)類型生效了。
而字面量的情況,推導(dǎo)出的是 readonly [1,2,3],帶有 readonly 所以不匹配 unknown[],繼續(xù)往下匹配,就匹配到了帶有類型參數(shù)的那個函數(shù)類型。
這樣兩種情況就都應(yīng)用了合適的函數(shù)類型。
全部代碼是這樣的:
type Zip
到此,相信大家對“TS面試題實例代碼分析”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!