-
-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Open
Description
14 - First of Array
This is an exciting challenge because it has so many alternatives, all of which are little learning opportunities. Beyond that, being able to access values from a tuple is a core skill when working with TypeScript and this challenge starts to get those muscles pumping.
🎥 Video Explanation
🔢 Code
import type { Equal, Expect } from './test-utils'
type A1 = First<[3, 2, 1]>;
type B1 = 3;
type C1 = Expect<Equal<A1, B1>>;
type A2 = First<[() => 1, { a: string }]>;
type B2 = () => 1;
type C2 = Expect<Equal<A2, B2>>;
type A3 = First<[]>;
type B3 = never;
type C3 = Expect<Equal<A3, B3>>;
type A4 = First<[undefined]>;
type B4 = undefined;
type C4 = Expect<Equal<A4, B4>>;
// @ts-expect-error(2344)
type E1 = First<'notArray'>;
// @ts-expect-error(2344)
type E2 = First<{ 0: 'arrayLike' }>;
// start with `= T[0]`
// ============= Your Code Here =============
type First<T extends unknown[]> =
T extends []
? never
: T[0]
;
// ============== Alternatives ==============
type First<T extends unknown[]> =
T['length'] extends 0
? never
: T[0]
;
type First<T extends unknown[]> =
T extends never[] // also `[never]`
? never
: T[0]
;
type First<T extends unknown[]> =
T extends [infer Head, ...infer _]
? Head
: never
;
/* @nagq */
type First<T extends unknown[]> =
T[0] extends T[number]
? T[0]
: never;
type First<T extends unknown[]> =
'0' extends keyof T
? T[0]
: never;
type First<T extends unknown[]> =
'0' extends keyof T
? T[0] extends infer U
? U
: never
: never;
type First<T extends unknown[]> =
T[number] extends never
? never
: T[0];
type First<T extends unknown[]> =
T extends [infer Head, ...any[]]
? Head
: never;
type First<T extends unknown[]> =
T extends [infer Head, ...any]
? Head
: never;
type First<T extends unknown[]> =
T extends [any, ...any[]]
? T[0]
: never;
type First<T extends unknown[]> =
T extends [T[0], ...any]
? T[0]
: never;
type First<T extends unknown[]> =
T[Extract<keyof T, '0'>]
// ================== NOPE ==================
type Nope0<T extends unknown[]> =
T[0] extends undefined
? never
: T[0]
;➕ More Solutions
For more video solutions to other challenges: see the umbrella list! #21338
Metadata
Metadata
Assignees
Labels
No labels