TypeScript Version: nightly (2.1.0-dev.20160818)
Code
I lifted this from Anders's final example in #9407 (comment).
typeResult<T>={success: true,value: T}|{success: false};functionfoo(): Result<number>{if(someTest()){return{success: true,value: 42};}else{return{success: false};}}functionsomeTest(): Boolean{returntrue;}Expected behavior:
Type-checks OK
Actual behavior:
Type error:
result.ts(5,16): error TS2322: Type '{ success: boolean; value: number; }' is not assignable to type 'Result<number>'.
Type '{ success: boolean; value: number; }' is not assignable to type '{ success: false; }'.
Types of property 'success' are incompatible.
Type 'boolean' is not assignable to type 'false'.
result.ts(8,16): error TS2322: Type '{ success: boolean; }' is not assignable to type 'Result<number>'.
Type '{ success: boolean; }' is not assignable to type '{ success: false; }'.
Types of property 'success' are incompatible.
Type 'boolean' is not assignable to type 'false'.
If I add manual type annotations (true as true, false as false) to the success assignments it works:
functionfoo(): Result<number>{if(someTest()){return{success: trueastrue,value: 42};}else{return{success: falseasfalse};}}The bug only affects Boolean literals. If I use enum, number, or string type literals it works - for example:
typeResult<T>={success: 1,value: T}|{success: 0};functionfoo(): Result<number>{if(someTest()){return{success: 1,value: 42};}else{return{success: 0};}}
TypeScript Version: nightly (2.1.0-dev.20160818)
Code
I lifted this from Anders's final example in #9407 (comment).
Expected behavior:
Type-checks OK
Actual behavior:
Type error:
If I add manual type annotations (
true as true,false as false) to thesuccessassignments it works:The bug only affects Boolean literals. If I use enum, number, or string type literals it works - for example: