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
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions