yunliuyan / type-challenges

typescript-challenges
0 stars 2 forks source link

00011-easy-first #11

Open yunliuyan opened 11 months ago

yunliuyan commented 11 months ago

第一个元素 简单 #array

by Anthony Fu @antfu

接受挑战    English 日本語 한국어

欢迎 PR 改进翻译质量。

实现一个通用First<T>,它接受一个数组T并返回它的第一个元素的类型。

例如:

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
import type { Equal, Expect } from '@type-challenges/utils'

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 errors = [
  // @ts-expect-error
  First<'notArray'>,
  // @ts-expect-error
  First<{ 0: 'arrayLike' }>,
]

返回首页 分享你的解答 查看解答

相关挑战

15・最后一个元素
yunliuyan commented 11 months ago

思路

通过索引取元组的第一个值

代码

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

type First<T extends any[]> = T[0]

type head1 = First<arr1> // expected to be 'a'
type head2 = First<arr2> // expected to be 3
Janice-Fan commented 11 months ago
type First<T extends any[]> = T extends [infer P, ...any[]] ? P : never;

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
liangchengv commented 11 months ago
type First<T extends unknown[]> = T extends [infer U, ...unknown[]] ? U : never;

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

type tail1 = First<arr1>; // expected to be 'a'
type tail2 = First<arr2>;  // expected to be 3
Naparte commented 11 months ago


// 实现一个通用First<T>,它接受一个数组T并返回它的第一个元素的类型。

type First<T extends any[]> = T extends [infer F, ...infer arg] ? F : never;

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
wudu8 commented 11 months ago
type MyEasyFirst<T extends any[]> = T[0];

const easyFirstFun = () => 1;
type easyFirstArr1 = ["a", "2", 3, true];
type easyFirstArr2 = [2, "2", 3, true];
type easyFirstArr3 = [false, "2", 3, true];
type easyFirstArr4 = [true, "2", 3, true];
type easyFirstArr5 = [typeof easyFirstFun, "2", 3, true];

type easyFirstTest1 = MyEasyFirst<easyFirstArr1>; // expected to be 'a'
type easyFirstTest2 = MyEasyFirst<easyFirstArr2>; // expected to be 2
type easyFirstTest3 = MyEasyFirst<easyFirstArr3>; // expected to be false
type easyFirstTest4 = MyEasyFirst<easyFirstArr4>; // expected to be true
type easyFirstTest5 = MyEasyFirst<easyFirstArr5>; // expected to be () => number
type easyFirstTest7 = MyEasyFirst<["a", "2", 3, true]>; // expected to be 'a'
type easyFirstTest8 = MyEasyFirst<[() => number, "2", 3, true]>; // expected to be () => number