0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

type-challenges解いてみた 初級 14-First of Array編

Last updated at Posted at 2025-03-09

問題


  配列`T`を受け取り、その最初のプロパティの型を返す`First<T>`を実装します。

  例えば:

```ts
  type arr1 = ['a', 'b', 'c']
  type arr2 = [3, 2, 1]

  type head1 = First<arr1> // expected to be 'a'
  type head2 = First<arr2> // expected to be 3

  type cases = [
  Expect<Equal<First<[3, 2, 1]>, 3>>,
  Expect<Equal<First<[() => 123, { a: string }]>, () => 123>>,
  Expect<Equal<First<[]>, never>>,
  Expect<Equal<First<[undefined]>, undefined>>,
]
```

配列型を受け取り、最初の要素の型を返す型を実装する問題です。

回答

type First<T extends any[]> = T extends [infer A, ...infer rest] ? A : never

実は最初思いついたのは以下の回答だったのですが、他の方が挙げていた上の回答がとても綺麗だったのでこちらを回答として解説していきたいと思います。(下記の回答でも一応テストは通過できます)

type First<T extends any[]> = T extends [] ? never : T[0]

解説

  • infer
    inferは一言で説明するのが難しいのですが、extendsの右辺に置くことができる、型を推論する演算子です。
    今回のinfer Aというのは、Tを[A, ...]というAを最初の要素にした配列型と推論できればAを、できなければneverを返すという書き方です。

なんでこのinferを使った解き方が優れているのかというと、これ最初の要素の型以外もすごく楽に指定できるんですよね。

type Last<T extends any[]> = T extends [...infer rest, infer A] ? A : never

こうすると最後の要素を指定できますし、

type Second<T extends any[]> = T extends [unknown, infer A, ...infer rest] ? A : never

こうすれば二番目の要素、みたいな感じで色々なパターンを同じ方法で解けます。すごい。

リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?