## 経緯
前から[[TypeScript]]の腕を磨くため[[Type Challenges]]に挑戦したいと思いつつ、毎回実戦でした学習できていないので何かしたいと思っていた。
ちょうど、数週間後に[[TypeScript]]の実践で利用できる少し高度な型定義についてプレゼンテーションをする機会があり、せっかくなのでそれまでにスキルアップとネタ探しを兼ねてやってみようと思った次第。
## 回答状況とメモ
> [!warning]
> **答えを記載しているので知りたくない人はここから先に進まない方がよい**
詳細は記載しない。苦戦したり印象に残る出題があったら別に[[ノート]]を作成するつもり。
### warm-up
- [x] 13 Hello World
### easy
- [x] 4 Pick
- `type MyPick<T, K extends keyof T> = {[P in K]: T[P]}`
- [[ジェネリック制約 (TypeScript)|ジェネリック制約]]で右辺の型を[[Narrowing]]するのか...
- 30分くらいハマった。。難しく考えすぎた
- [x] 7 Readonly
- `type MyReadonly<T> = {readonly [K in keyof T]: T[K]}`
- これは1分以内で
- [x] 11 Tuple to Object
- `type TupleToObject<T extends readonly PropertyKey[]> = {[V in T[number]]: V}`
- `string | number | symbol` を [[PropertyKey (TypeScript)|PropertyKey]]で表せることを知った
- 5分くらい. 右辺の表現にてこずった
- [x] 14 First of Array
- `type First<T extends any[]> = T extends [] ? never : T[0]`
- [[条件付き型 (TypeScript)|条件付き型]]を使っていいのか...?
- 良さそう
- [x] 18 Length of Tuple
- `type Length<T extends readonly unknown[]> = T extends {length: infer L} ? L :never`
- 頑張らなくても... `type Length<T extends readonly unknown[]> = T["length"]`
- [x] 43 Exclude
- `type MyExclude<T, U> = T extends U ? never : T`
- [x] 189 Awaited
- `type MyAwaited<T> = T extends {then: (onfullfilled: (arg: infer U) => any) => any} ? MyAwaited<U> : T`
- [x] 268 If
- `type If<C extends boolean, T, F> = C extends true ? T : F`
- [x] 533 Concat
- `type Concat<T extends readonly unknown[], U extends readonly unknown[]> = [...T, ...U]`
- [x] 898 Includes
- むずすぎ。。。 `Equal` 自力だったら絶対無理
```ts
type If<C extends boolean, T, F> = C extends true ? T : F
type Includes<T extends readonly any[], U> =
T extends [infer E, ...infer R] ? If<Equal<U, E>, true, Includes<R, U>> : false
```
- [x] 3057 Push
- `type Push<T extends readonly unknown[], U> = [...T, U]`
- タプル指定はないから `type Push<T extends unknown[], U> = [...T, U]` か
- [x] 3060 Unshift
- `type Unshift<T extends unknown[], U> = [U, ...T]`
- [x] 3312 Prameters
- `type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer U) => any ? U : never`
### medium
- [x] 2 Get Return Type
- `type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never`
### hard
> [!thinking] ここまでできたらいいな。。
### extreme
> [!thinking] 多分やらないと思う