Open30
type-challenges
ピン留めされたアイテム

このスクラップのコメント一覧
warm-up (1/1)
easy (13/13)

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 にならないので対応が必要。

106 - Trim Left
回答
type TrimLeft<A extends string> = A extends `${' ' | '\n' | '\t'}${infer B}` ? TrimLeft<B> : A

108 - Trim
回答
type Trim<A extends string> = A extends `${' ' | '\n' | '\t'}${infer B}` | `${infer B}${' ' | '\n' | '\t'}` ? Trim<B> : A

110 - Capitalize
回答
type MyCapitalize<A extends string> = A extends `${infer B}${infer C}` ? `${Uppercase<B>}${C}` : A