Search code examples
typescripttuples

Typescript: Remove entries from tuple type


not sure if this is possible, but I would like to be able to define a type that converts tuples like: [number, string, undefined, number] to [number, string, number] (ie filter out undefined).

I thought about something like this:

type FilterUndefined<T extends any[]> = {
    [i in keyof T]: T[i] extends undefined ? /* nothing? */ : T[i];
}

Sadly I am am pretty sure that there is no way to achieve this.


Solution

  • TS 4.1

    Filter operations on tuples are now officially possible:

    type FilterUndefined<T extends unknown[]> = T extends [] ? [] :
        T extends [infer H, ...infer R] ?
        H extends undefined ? FilterUndefined<R> : [H, ...FilterUndefined<R>] : T
    
    Let's do some tests to check, that it is working as intended:
    type T1 = FilterUndefined<[number, string, undefined, number]> 
    // [number, string, number]
    type T2 = FilterUndefined<[1, undefined, 2]> // [1, 2]
    type T3 = FilterUndefined<[undefined, 2]> // [2]
    type T4 = FilterUndefined<[2, undefined]> // [2]
    type T5 = FilterUndefined<[undefined, undefined, 2]> // [2]
    type T6 = FilterUndefined<[undefined]> // []
    type T7 = FilterUndefined<[]> // []
    

    More infos


    Playground