Open16
type-challengesをやる

1日1問やっていくぅ

これが良さそう。やばいほどむずい型パズルは必要ではなさそうだから基礎的な内容をさらうイメージで初級中級あたりをやろかな

type Foo = {
readonly bar: number;
readonly bas: number;
}
こんな感じでreadonlyを使うことでプロパティを読み取り専用にできる

type Length<T extends any[]> = T['length']
わからんかった。ヒント見たら理解したけどあんま、こういう使い方したことがない

type TupleToObject<T extends readonly any[]> = {
[K in T[number]]: T[number]
}

type Push<T extends any[], K> = [...T, K]
型も値の配列みたいな感じで展開できるのか、なんかちょっと違和感あるのはこういうパターンを使ったことがないからかな?

type Unshift<T extends any[], U> = [U, ...T]
さっきのとほぼ同じ

type MyPick<T, K extends string | number | symbol> = {
[k in K]: k extends keyof T ? T[k] : never
}
extendsで条件文を書いて、条件に当てはまらないプロパティはneverを当てはめることで消せるのか
この問題は後でもう一度やろう

type If<C extends boolean, T, F> = C extends true ? T : F
こいつは解けたぜ

type MyAwaited<T> = T extends Promise<infer U> ? U : never
inferはスラスラ読めるし書けるようにしたい

type Concat<T extends any[], U extends any[]> = [...T, ...U];

type First<T extends any[]> = T extends [] ? never : T[0]
一応正解っぽいが
type First<T extends any[]> = T extends [infer U, ...any[]] ? U : never;
こういう書き方もできるらしい

type Includes<T extends any[], U> = U extends T[number] ? true : false
Tが配列の方の場合、T[number]で配列要素のユニオン型が作れる

type MyParameters<T extends (...args: any) => any> = T extends (
...args: infer P
) => any
? P
: never;
全然わからんかった
(...args: any) => any
一般的な関数の型

以上で初級編全部終わり