Skip to content

narrow array type with .filter(Boolean) #30621

Closed

Description

@mmkal

Search Terms

narrow, array, filter

Suggestion

add this overload to Array<T>.filter:

filter(fn: typeof Boolean): Array<Exclude<T, null | undefined | 0 | ''>>

This may be considered too specific - but the use case is very common so hopefully worth it.

Use Cases

This will allow using array.filter(Boolean) to get rid of null/undefined/falsy values, and have the type system track it correctly even with strictNullChecks.

Right now the options are to use lodash.compact or write a similar function (not ideal to add a dependency), or to use ! (myArray.filter(Boolean).map(val => val!.foo(...))) which is a little dangerous.

Examples

Example

const maybeStrings = ['foo', null, 'bar']
const definitelyStrings = maybeStrings.filter(Boolean)

definitelyStrings is of type (string | null)[] even though it's impossible for nulls to be in it.

current behaviour:
image

proposed behaviour:
image

Checklist

My suggestion meets these guidelines:

  • This wouldn't be a breaking change in existing TypeScript/JavaScript code (I don't think so - types would become more specific)
  • This wouldn't change the runtime behavior of existing JavaScript code
  • This could be implemented without emitting different JS based on the types of the expressions
  • This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
  • This feature would agree with the rest of TypeScript's Design Goals.

Activity

  1. jack-williams commented on Mar 27, 2019

    @jack-williams
    Collaborator

    See #29955

  2. mmkal commented on Mar 28, 2019

    @mmkal
    Author

    Jack Williams (@jack-williams) interesting, it'd be great if this could be solved by modifying the type of Boolean rather than filter. But I just tried manually putting in Forbes Lindesay (@ForbesLindesay) 's signature in typescript@next and it doesn't allow using .filter(Boolean) without explicitly supplying the generic i.e. .filter<string>(Boolean). That's fine-ish for strings but when it's a complex inferred type it wouldn't be feasible.

  3. typescript-bot commented on Mar 30, 2019

    @typescript-bot
    Contributor

    This issue has been marked as a 'Duplicate' and has seen no recent activity. It has been automatically closed for house-keeping purposes.

  4. ForbesLindesay commented on Apr 8, 2019

    @ForbesLindesay
    Contributor

    Misha Kaletsky (@mmkal) That can be fixed, but will require improvements to the inference engine.

  5. locked as resolved and limited conversation to collaborators on Oct 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    DuplicateAn existing issue was already created

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions