- Notifications
You must be signed in to change notification settings - Fork 13.1k
Description
Currently this function compiles just fine
function foo(x): string { return; }I understand that it's happening because undefined is a valid result for a variable of type string, and this sort of related back to #185, but a midway point could be to simply require the return statement to not be empty.
Similarly, this code fails to compile:
function foo(x): string { }But this one compiles:
function foo(x): string { if(false) { return; } }I think the expected behavior is that every branch should require an explicit return statement.
A side benefit of this is that you can get exhausting matching completeness basically for free:
function foo(x: number | string | boolean): string { if(typeof x === 'number') { return x.toString(); } else if (typeof x === 'string') { return x; } }Currently the above compiles, but if TypeScript required an explicit return in every branch for non void return functions, there would be a compiler error because there are remaining types in the union. However this would compile:
function foo(x: number | string | boolean): string { if(typeof x === 'number') { return x.toString(); } else if (typeof x === 'string') { return x; } else if (typeof x === 'boolean') { return ''+x; } }This is pretty nice! There is one edge case still -- because of the implicit void included in x, calling foo(null) or foo(undefined) will return undefined. I don't know what to do about this because it relates pretty heavily to #185. I think for now it can be ignored, and whatever resolution that (hopefully) happens there will take care of it.