mosya<TC> - 配列の先頭に要素を追加する型を作ろうの解説
この記事はmosya<TC>の問題の一つであるUnshift型の解説になります。
問題
以下のように配列の先頭に要素を追加する型を実装します。
type Result = Unshift<[1, 2], 0>; // [0, 1, 2,]
前提知識
この問題を解くにあたって型についての以下の知識を理解しておく必要があります。
- ジェネリクスを理解する
- スプレッド演算子を理解する
ジェネリクスを理解する
まず、<T>というのは、ジェネリクスと呼ばれる機能です。ジェネリクスは、型をパラメータとして受け取ることができる機能です。
この受け取った値を使って、新しい型を生成することができます。
受け取った型を活用して、新しい型を生成することができるので、型の再利用性が高くなります。
例えば、以下のような型が考えられます
type Foo<T> = {
bar: T;
};
この型は、T
という型を受け取り、bar
というプロパティにT
を代入する型です。
この型を使うと、以下のように型を指定することができます。
type FooString = Foo<string>; // { bar: string }
type FooNumber = Foo<number>; // { bar: number }
このようにジェネリクスは型を引数として受け取って、新しい型を生成することができます。
型の制約
T
はextends
をつけることで制約をつけることができます。
例えば、T extends string
とすると、T
はstring
型かstring
型を継承した型に制約されます。
スプレッド演算子を理解する
スプレッド演算子...
は、配列やオブジェクトの中身を展開する演算子です。
これを使うと配列やオブジェクトの中身を展開して、新しい配列やオブジェクトを生成することができます。
実際の値だけでなく型にもこの演算子を使うことができます。
例えば、以下のような型が考えられます。
type Foo = [1, 2, 3];
type Bar = [0, ...Foo]; // [0, 1, 2, 3]
解答例
以上の前提知識を使うことで、以下のように解答することができます。
T
に対して、extends
をつけることで配列しか受け取れないように制約をかけるのがポイントです。
type Unshift<T extends any[], U> = [
U,
...T
];
Authored by
Godai@steelydylan
Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。