Closed
Description
TypeScript Version: typescript@2.1.0-dev.20160913
Code
type FAILURE = "FAILURE";
const FAILURE = "FAILURE";
type Result<T> = T | FAILURE;
function doWork<T>(): Result<T> {
return FAILURE;
}
function isSuccess<T>(result: Result<T>): result is T {
return !isFailure(result);
}
function isFailure<T>(result: Result<T>): result is FAILURE {
return result === FAILURE;
}
function increment(x: number): number {
return x + 1;
}
let result = doWork<number>();
if (isSuccess(result)) {
increment(result);
// ~~~~~~
// Argument of type 'string | number' is not assignable to parameter of type 'number'.
// Type 'string' is not assignable to type 'number'.
}
Expected behavior:
result
(before the narrowing) should be"FAILURE" | number
result
(after the narrowing) should benumber
Actual behavior:
result
(before the narrowing) isstring | number
result
(after the narrowing) isstring | number