Skip to content

Partial type fails to narrow in spite of check for undefined #29496

@NoelAbrahams

Description

@NoelAbrahams

The code below works in TS 3.0.

TypeScript Version: 3.2.1.0

Search Terms: is:issue 3.2 Partial

Code

declare function never(value: never): never;

    const enum BarEnum {
        bar1 = 1,
        bar2 = 2,
    }

    type UnionOfBar = TypeBar1 | TypeBar2;

    type TypeBar1 = {

        type: BarEnum.bar1;
    };

    type TypeBar2 = {

        type: BarEnum.bar2;
    };

    const value: Partial<UnionOfBar> = {} as any;

    if (value.type !== undefined) {

        switch (value.type) {

            case BarEnum.bar1: break;
            case BarEnum.bar2: break;
            default: never(value.type); // Error: Type 'undefined' is not assignable to parameter of type 'never'
        }
    }

Expected behavior:
No compiler error

Actual behavior:
Type 'undefined' is not assignable to parameter of type 'never'

Playground Link:
http://www.typescriptlang.org/play/#src=declare%20function%20never(value%3A%20never)%3A%20never%3B%0D%0A%0D%0Aconst%20enum%20BarEnum%20%7B%0D%0A%20%20%20%20%20%20%20%20bar1%20%3D%201%2C%0D%0A%20%20%20%20%20%20%20%20bar2%20%3D%202%2C%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%20%20%20%20type%20UnionOfBar%20%3D%20TypeBar1%20%7C%20TypeBar2%3B%0D%0A%0D%0A%20%20%20%20type%20TypeBar1%20%3D%20%7B%0D%0A%0D%0A%20%20%20%20%20%20%20%20type%3A%20BarEnum.bar1%3B%0D%0A%20%20%20%20%7D%3B%0D%0A%0D%0A%20%20%20%20type%20TypeBar2%20%3D%20%7B%0D%0A%0D%0A%20%20%20%20%20%20%20%20type%3A%20BarEnum.bar2%3B%0D%0A%20%20%20%20%7D%3B%0D%0A%0D%0A%20%20%20%20const%20value%3A%20Partial%3CUnionOfBar%3E%20%3D%20%7B%7D%20as%20any%3B%0D%0A%0D%0A%20%20%20%20if%20(value.type%20!%3D%3D%20undefined)%20%7B%0D%0A%0D%0A%20%20%20%20%20%20%20%20switch%20(value.type)%20%7B%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BarEnum.bar1%3A%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20BarEnum.bar2%3A%20break%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20default%3A%20never(value.type)%3B%20%2F%2F%20Error%3A%20Type%20'undefined'%20is%20not%20assignable%20to%20parameter%20of%20type%20'never'%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D

Related Issues:
#28748

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFixedA PR has been merged for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions