Open22
type-challenges
ピン留めされたアイテム
このスクラップのコメント一覧
warm-up
easy
- 4 - Pick
- 7 - Readonly
- 11 - Tuple to Object
- 14 - First of Array
- 18 - Length of Tuple
- 43 - Exclude
- 189 - Awaited
- 268 - If
- 533 - Concat
- 898 - Includes
- 3057 - Push
- 3060 - Unshift
- 3312 - Parameters
medium
11 - Tuple to Object
回答
type TupleToObject<T extends readonly (keyof any)[]> = { [A in T[number]]: A }
189 - Awaited
回答
type MyAwaited<T> = T extends {then: (onFulfilled: (value: infer A) => unknown) => unknown} ? MyAwaited<A> : T
Promise
に Thenable な型 T
が混ざっている。
Promise
も Thenable な型なので定義を Thenable 側に合わせれば両用できる。
Thenable
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise#thenable
533 - Concat
回答
type Concat<T extends readonly unknown[], U extends readonly unknown[]> = [...T, ...U]
898 - Includes
回答
type Includes<T extends readonly any[], U> = T extends [infer A, ...infer B]
? (<C>() => C extends A ? 1 : 0) extends (<C>() => C extends U ? 1 : 0) ? true : Includes<B, U>
: false
3312 - Parameters
回答
type MyParameters<T extends (...args: any[]) => unknown> = T extends (...args: infer A) => unknown ? A : never
9 - Deep Readonly
回答
type DeepReadonly<T> = { readonly [A in keyof T]: T[A] extends (...args: any[]) => unknown ? T[A] : DeepReadonly<T[A]> }
オブジェクトと配列のみ readonly
にしたい。
用意されているケースの () => 22
以外の型は mapped type でオブジェクトに変換されないっぽい。
This mapped type returns a primitive type, not an object type.
https://github.com/microsoft/TypeScript/wiki/FAQ#common-bugs-that-arent-bugs
() => 22
だけ除外する mapped type でオブジェクトと配列のみ readonly
を表現できた。