-
Notifications
You must be signed in to change notification settings - Fork 127
Open
Description
Currently calling the filter(Boolean) method on a tuple turns it into an array of union:
let tuple = ["foo", undefined, "bar", 0] as const;
tuple.filter(Boolean) // ("foo" | "bar")[] We can enhance the function to instead return the filtered tuple:
interface ReadonlyArray<T> {
filter(
predicate: BooleanConstructor,
thisArg?: any,
): FilterNonFalsy<this>;
}
type FilterNonFalsy<T> = T extends readonly [infer F, ...infer R]
? F extends false | 0 | "" | null | undefined | 0n
? FilterNonFalsy<R>
: [F, ...FilterNonFalsy<R>]
: [];outputs:
(["1", "2", undefined] as const).filter(Boolean) // now: ["1" | "2"] prev: ("1" | "2")[]
([0, null, undefined, false, ""] as const).filter(Boolean) // now: [] prev: never[]The order of values in a tuple will most definitely be maintained with this method
vlinder
Metadata
Metadata
Assignees
Labels
No labels