Open25
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
を表現できた。
15 - Last of Array
回答
type Last<A extends unknown[]> = A extends [...unknown[], infer B] ? B : never
20 - Promise.all
回答
declare function PromiseAll<A extends unknown[]> (
values: [...A],
): Promise<{ [B in keyof A]: A[B] extends Promise<infer C> | infer C ? C : never }>
配列ではなくタプルとして推論させるために A
ではなく [...A]
とする。
A[B]
だと union distribution にならないので対応が必要。