Skip to content

When is guards for incompatible types are assigned to each other, an error occurs (breaks Array filter) #29501

Closed

Description

TypeScript Version: 3.3.0-dev.20190119

Search Terms:
filter, type guard, mutually exclusive guard

Code

class MyArray<T> {
    constructor(arr: Array<T>) { };
    filter<S extends T>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => value is S, thisArg?: any): MyArray<S> { return (null as any); };
    // Do not include fallback case! This is how MyArray differs from Array's filter type.
    // filter(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => any, thisArg?: any): T[];
}

declare function isBoolean(a: any): a is boolean;

declare const numArr: Array<number>;
const test1: Array<boolean> = numArr.filter(isBoolean);
// Here I'd expect Array<never>
// The actual result is Array<number>
// This is because the type guarded case is falling through completely

declare const myNumArray: MyArray<number>;
const test2: Array<boolean> = myNumArray.filter(isBoolean);
// When there is no such case, the error becomes clear

Expected behavior
When is guards for incompatible types are assigned to each other, the result should be never.

Actual behavior
When is guards for incompatible types are assigned to each other, an error occurs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    Design LimitationConstraints of the existing architecture prevent this from being fixed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions