TypeScript Type Challenges
Warm up
Hello World
stringに変えて問題ないかの確認
Medium
Get Return Type
code:typescript
type MyReturnType<T extends (...args: any[]) => any> = T extends (...args: any[]) => infer R ? R : never
Chainable Options
上書き
除外ルールが大分手間
上書きできるけど、同じtypeの上書きはNG
wintyo.icon 型的には不要だけど、値は変更されているからNGにするの実際は変じゃない?
code:typescript
type Chainable<T = {}> = {
option<K extends string, V>(
key: K extends keyof T
? never
: K
: K,
value: V
): Chainable<Omit<T, K> & { key in K: V }> get(): T
}
Promise.all
可変長引数として受け取ることでタプルになる
先にreadonlyを宣言させることでそっちで吸収される
code:typescript
declare function PromiseAll<T extends any[]>(values: readonly ...T): Promise<{ }>
Type Lookup
code:typescript
type LookUp<U, T> = U extends { type: T } ? U : never
Append Argument
引数に追加させる
wintyo.icon inferで拾ったparametersから一つ加えるだけでいけそう
Flip Arguments
BEM style string
Inorder Traversal
wintyo.icon 二分探索木でアクセスする順に拾ってこいってこと?
Flip
Zip
IndexOf
wintyo.icon TSでやることじゃない。。
code:typescript
type StrictEqual<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
? StrictEqual<X, U> extends true
: -1
LastIndexOf
code:typescript
type StrictEqual<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
? StrictEqual<X, U> extends true
: LastIndexOf<R, U>
: -1
Unique
MapTypes
Construct Tuple