type-challenges
やり方
問題が記述されたmarkdownに飛ぶ
そこにあるhttps://img.shields.io/badge/-Take%20the%20Challenge-3178c6?logo=typescript&logoColor=white#.pngを押すと、コードがあらかじめ入力されたTS Playgroundに飛ぶ そこで直接編集して、Type ErrorsをなくせばOK
他の人の回答はhttps://img.shields.io/badge/-Check%20out%20Solutions-de5a77?logo=awesome-lists&logoColor=white#.pngから見れる
like順にsortされているので、良さげな解答例から順に見れる
issueにcursorをhoverすると便利
issueの冒頭にある解答が表示される
マウスを動かすだけで複数の解答をざっと見れる
以下、ネタバレ注意
warm-up (1)
easy (13)
$ type Pick<T, K extends keyof T> = { Key in K: TKey }; $ type TupleToObject<T extends readonly (string | number | symbol)[]> = { [K in Tnumber]: K }; ✅️type error = TupleToObject<[[1, 2], {}]>をerrorにできなかった
2024-07-15 00:56:37 extendsで条件分岐するのではなく、Tに予め型制約をかけるとtype errorにできる code:diff
- type TupleToObject<T extends readonly []> = Tnumber extends string | number | symbol ? { [K in Tnumber]: K }: never; + type TupleToObject<T extends readonly (string | number | symbol)[]> = { [K in Tnumber]: K }; $ type First<T extends unknown[]> = T extends [infer E, ...unknown[]] ? E : never;
一通り調べたが、言及がなかった
$ type First<T extends unknown[]> = T extends [] ? never : T0 $ type First<T extends uknown[]> = T"length" extends 0 ? never : T0 Tが配列型のときnumber
[][number]がneverになることを使っている $ type Length<T extends readonly unknown[]> = T"length"; 別解
$ type Length<T extends readonly unknown[]> = T extends { length: infer N } ? N : never;
T[K]で済むところを回りくどく書いただけ
$ type Exclude<U, E> = U extends E ? never : U
Promise<T>をTにするやつ
$ type
$ type If<C extends boolean, T, F> = C extends true ? T : F;
$ type Concat<T extends readonly unknown[], U extends readonly unknown[]> = ...T, ... U code:898.ts
type Includes<T extends readonly any[], U> = T0 extends U ? U extends T0 ? true : Includes2<T, U> : Includes2<T, U> type Includes2<T extends readonly any[], U> = T extends unknown ? false : Includes<Shift<T>, U>; これだと一部が失敗する
なぜextends readonly any[]?takker.icon
という違いらしい
$ type Push<T extends any[], U> = ...T, U $ type Unshift<T extends any[], U> = U, ...T medium (97)
$ type DeepReadonly<T> = T extends Record<string, unknown> ? { readonly K in keyof T: DeepReadonly<TK> } : T $
無限ループになってしまったtakker.icon
急いでいるので答えを見る
これであっているはずなんだが、うまくいかないな……
code:26401.ts
type toType<Literal extends string> = Literal extends "string"
? string
: Literal extends "number"
? number
: Literal extends "boolean"
? boolean
: Literal extends "object"
? Record<string, unknown>
: Literal extends "array"
? unknown[]
: unknown;
type JSONSchema2TS<T> =
T extends { type: string }
? T extends { enum: infer U}
? T extends { properties: infer O }
? O extends Record<string, unknown>
? T extends { required: infer R }
? R extends (keyof O)[]
? { [K in Rnumber]: JSONSchema2TS<OK> } & { [K in Exclude<keyof O, Rnumber>]?: JSONSchema2TS<OK> } : never
? T extends { items: infer O }
? O extends Record<string, unknown>
? JSONSchema2TS<O>[]
: never
: never;
hard (52)
$ type IsAny<T> = 0 extends (1 & T) ? true : false;
extreme (17)