type-challenges
type-challenges copied to clipboard
16 - Pop
type Pop<T extends any[]> = T extends [...infer I, infer _] ? I : never
Similarly,
type Pop<T extends any[]> = T extends [...infer P, any] ? P : never
type Pop<T extends any[]> = T extends [...infer U, any] ? U : never
type Push<T extends any[], U> = [...T, U]
type Shift<T extends any[]> = T extends [any, ...infer U] ? U : never
type Unshift<T extends any[], U> = [U, ...T]
Probably preferable to make the “any” become “unknown” in these examples since many default eslint configs as well as tsconfig like to complain about the use of any.
unknown works just as well here.
type Pop<T extends unknown[]> = T extends [...infer U, unknown] ? U : never
type Push<T extends unknown[], U> = [...T, U]
type Shift<T extends unknown[]> = T extends [unknown, ...infer U] ? U : never
type Unshift<T extends unknown[], U> = [U, ...T]
type Pop<T extends any[]> = T extends [...infer I, infer _] ? I : never
RU: https://ru.stackoverflow.com/questions/1375991/%d0%9a%d0%b0%d0%ba-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d1%82%d0%b8%d0%bf-pop/1376076#1376076
I found that the last test case was not passing for me. I instead returned the array to comply with the last test case.
// my solution - notice, I return T if T does not extend an array that has items.
type Pop<T extends any[]> = T extends [...infer FirstSet, infer _] ? FirstSet : T
// last test case
Expect<Equal<Pop<[]>, []>>,
type Pop<T extends any[]> = T extends [...infer U, any] ? U : never
Same here this is what I landed on.
type Pop<T extends any[]> = T extends [...infer start, unknown] ? start : T;
? start : []
also works.
This is what I came up with:
type Pop<T extends any[]> = T['length'] extends 0 ? [] : T extends [...infer First, infer Last] ? First : never;
type Pop<T extends any[]> = T extends []
? []
: T extends [...infer R, infer L]
? R
: never;
type Pop<T extends unknown[]> = T extends [...infer U, unknown] ? [...U] : T;
type Pop<T extends any[]> = T extends [...infer P, any] ? P : T extends [] ? [] : never
Why does the Pop type in the code doesn't assign Test a type of number[]
?
type Pop<T extends any[]> = T extends [... infer NT, unknown] ? NT : []; type Test = Pop<number[]>; // Test type = []. Why not number[]?
type Pop<T extends any[]> =T extends [...infer U,unknown]?U:[]
The original answer fails this test case Expect<Equal<Pop<[]>, []>>
type Pop<T extends any[]> = T extends [...infer I, unknown] ? I : []
Can this use Exclude to solve? I write for following code, it is related to 15. Last of Array
type Last<T extends any[]> = T extends [...any, infer K] ? K : never;
type Pop<T extends any[]> = Exclude<T, Last<T>>;
But this doesn't work.
type Pop<T extends unknown[]> = T extends [...infer item, any] ? [...item] : []
For empty array [], it returns [].
case
Expect<Equal<Pop<[]>, []>>
answer
type Pop<T extends any[]> = T extends [...infer Rest, infer _] ? Rest : []
type Pop<T extends any[]> = T extends [...infer A, any] ? A : []
Maybe I'm mssing something but all the above answer fail the test for Pop<[]> Need to return T if the extends is false:
type Pop<T extends unknown[]> = T extends [...infer Rest, infer _] ? Rest : T
type Pop<arr extends any[]> = arr extends [...infer leftArr, any] ? leftArr : never
type Pop<T extends any[]> = T extends [...infer U, any] ? U : never type Push<T extends any[], U> = [...T, U] type Shift<T extends any[]> = T extends [any, ...infer U] ? U : never type Unshift<T extends any[], U> = [U, ...T]
I have a question that Shift method seems to return the first element in array instead return left array.So, it should be that type Shift<arr extends any[]> = arr extends [infer First, ...any[]] ? First : never
. right? @antfu
Expect<Equal<Pop<[]>, []>>,
this won't pass
but using
type Pop<T extends any[]> = T["length"] extends 0 ? T : T extends [...infer TRest,infer _ ] ? TRest : never
will make it pass
latest version:
type Pop<T extends any[]> = T extends [...infer A, any] ? A : []
Maybe too much, but passed on all cases
type Pop<T extends any[], E extends any[] = []> = T extends [infer F, ...infer L]
? L extends [] // end of array
? E // return accumulator
: Pop<L, [...E, F]>
: E
type Pop<T extends any[]> =T extends [] ?[]: T extends [...infer B,any]?B:never