# ジェネリクス

**ジェネリクス**は抽象的な型引数を使用して、実際に利用されるまで型が確定しない関数などを実現する為に使用されます。

例えば、引数で受け取った文字列型をそのまま返却する関数と、引数で受け取った数値型をそのまま返却する関数があるとします。その場合以下のように内部的な処理は一緒ですが、引数と返却する型が異なる関数を定義する必要があります。

```typescript
const remainString = (val: string): string => {
  return val
};

const remainNumber = (val: number): number => {
  return val
}
```

こういった場合に、`const remainValue = <T>(val: T): T => {...}`と定義することで、使用時に`remainValue<string>('a')`と型宣言をして呼び出すことで、`T`の部分に`string`が格納され、`(arg: string): string`となります。ちなみに`T`の文字は<`SAMPLE>(val: SAMPLE): SAMPLE`でも動作しますが、慣習的に`T`としましょう。

<pre class="language-typescript" data-title="index.ts◎"><code class="lang-typescript">...
console.log(element.value);

<strong>const remainValue = &#x3C;T>(val: T): T => {
</strong><strong>  return val;
</strong><strong>};
</strong><strong>remainValue&#x3C;string>('a');
</strong><strong>remainValue&#x3C;number>(2);
</strong></code></pre>
