1.基礎(chǔ)
關(guān)于typescript類型編程的基礎(chǔ)看看官網(wǎng)的介紹基本上就夠了,這里就不贅述了,主要是記錄下個(gè)人學(xué)習(xí)的一些東西,實(shí)現(xiàn)的思路。
2.IsOption
實(shí)現(xiàn)可以判斷某個(gè)鍵值是否可選
type IsOptional<O, K extends keyof O> = Partial<Pick<O, K>> extends Pick<O, K> ? true: false
type test = {
a?: string
b: number
}
type res = IsOptional<test, 'a'> // true
3.思路
3.1如果用js實(shí)現(xiàn),將會(huì)是這樣
const obj = {
key1: 'optional',
key2: 'require'
}
function isOptional(obj, key) {
return obj[key] === 'optional'
}
isOptional(obj, 'key1')
關(guān)鍵的一步就是obj[key] === 'optional',想辦法判斷目標(biāo)和“可選標(biāo)記”是否相等
3.2獲取目標(biāo)我們可以用自帶的Pick
type test = {
a?: string
b: number
}
type target = Pick<test, 'a'>
3.3獲取了目標(biāo)我們需要做比較,那么和什么東西作比較呢?
我們無(wú)法獲知屬性上的“可選標(biāo)記”,但是我們可以把目標(biāo)和另一個(gè)長(zhǎng)得和目標(biāo)一樣的類型(只不過(guò)屬性是可選的)作對(duì)比
type test = {
a?: string
b: number
}
type target = Pick<test, 'a'>
// 構(gòu)造可選
type other = Partial<Pick<test, 'a'>>
// 對(duì)比
type isOptional = target extends other ? true : false