來玩TS嗎,機都給你開好了
?本題目旨在讓你更好的了解 TS 的類型系統(tǒng)(類型編程),編寫你自己的類型工具,或者只是單純的享受挑戰(zhàn)的樂趣!
?

實現(xiàn) Pick
實現(xiàn) TS 內(nèi)置的 Pick<T, K>,但不可以使用它。
從類型 T 中選擇出屬性 K,構(gòu)造成一個新的類型。
例如:
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyPick<Todo, 'title' | 'completed'>
const todo: TodoPreview = {
title: 'Clean room',
completed: false,
}
答案:

實現(xiàn) Readonly
不要使用內(nèi)置的Readonly
該 Readonly 會接收一個 泛型參數(shù),并返回一個完全一樣的類型,只是所有屬性都會被 readonly 所修飾。
也就是不可以再對該對象的屬性賦值。
例如:
interface Todo {
title: string
description: string
}
const todo: MyReadonly<Todo> = {
title: "Hey",
description: "foobar"
}
todo.title = "Hello" // Error: cannot reassign a readonly property
todo.description = "barFoo" // Error: cannot reassign a readonly property
答案:
元組轉(zhuǎn)換為對象
傳入一個元組類型,將這個元組類型轉(zhuǎn)換為對象類型,這個對象類型的鍵/值都是從元組中遍歷出來。
例如:
const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const
const result: TupleToObject<typeof tuple> // expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}
答案:

第一個元素
實現(xiàn)一個通用First
例如:
type arr1 = ['a', 'b', 'c']
type arr2 = [3, 2, 1]
type head1 = First<arr1> // expected to be 'a'
type head2 = First<arr2> // expected to be 3
答案:

獲取元組長度
創(chuàng)建一個通用的Length,接受一個readonly的數(shù)組,返回這個數(shù)組的長度。
例如:
type tesla = ['tesla', 'model 3', 'model X', 'model Y']
type spaceX = ['FALCON 9', 'FALCON HEAVY', 'DRAGON', 'STARSHIP', 'HUMAN SPACEFLIGHT']
type teslaLength = Length<tesla> // expected 4
type spaceXLength = Length<spaceX> // expected 5
答案:

實現(xiàn)Exclude
實現(xiàn)內(nèi)置的Exclude <T,U>
從T中排除可分配給U的那些類型
答案:

Awaited
假如我們有一個 Promise 對象,這個 Promise 對象會返回一個類型。在 TS 中,我們用 Promise 中的 T 來描述這個 Promise 返回的類型。請你實現(xiàn)一個類型,可以獲取這個類型。
比如:Promise
答案:

If
實現(xiàn)一個If util,它接受一個C泛型參數(shù),如果為true就返回類型T,如果為false,則返回類型F
例如:
type A = If<true, 'a', 'b'> // expected to be 'a'
type B = If<false, 'a', 'b'> // expected to be 'b'

Concat
實現(xiàn)數(shù)組的Concat類型版本
例如:
type Result = Concat<[1], [2]> // expected to be [1, 2]
答案:

Includes
?在類型系統(tǒng)中實現(xiàn)JavaScript Array.includes函數(shù)。一個類型需要兩個參數(shù)。輸出應該是一個布爾值的true或false。
?
例如:
type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'> // expected to be `false`
這題有難度,反正我是copy的!?。?/p>
Push
實現(xiàn)Array.push類型版本
例如:
type Result = Push<[1, 2], '3'> // [1, 2, '3']
答案:

Unshift
實現(xiàn)Array.unshift的類型版本
例如:
type Result = Unshift<[1, 2], 0> // [0, 1, 2,]
答案:

最后
以上這些題我都做過,歡迎評論區(qū)留言討論
參考文獻
https://github.com/type-challenges/type-challenges https://www.typescriptlang.org/docs/handbook/utility-types.html 往期干貨:
26個經(jīng)典微信小程序+35套微信小程序源碼+微信小程序合集源碼下載(免費)
干貨~~~2021最新前端學習視頻~~速度領(lǐng)取
前端書籍-前端290本高清pdf電子書打包下載
點贊和在看就是最大的支持??
