Closed
Description
TypeScript Version: nightly (2.1.0-dev.20160818)
Code
I lifted this from Anders's final example in #9407 (comment).
type Result<T> = { success: true, value: T } | { success: false };
function foo(): Result<number> {
if (someTest()) {
return { success: true, value: 42 };
}
else {
return { success: false };
}
}
function someTest(): Boolean { return true; }
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:
function foo(): Result<number> {
if (someTest()) {
return { success: true as true, value: 42 };
}
else {
return { success: false as false };
}
}
The bug only affects Boolean literals. If I use enum, number, or string type literals it works - for example:
type Result<T> = { success: 1, value: T } | { success: 0 };
function foo(): Result<number> {
if (someTest()) {
return { success: 1, value: 42 };
}
else {
return { success: 0 };
}
}