I am writing an API which has 2, very similar, functions:
function update(f: () => string) {...}
function updateDeep(f: () => void) {...}
It isn't possible to make this happen. As the recipient of a function, your only ability is to set a lower bound on what kind function is provided.
See also the TypeScript FAQ entry: https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-functions-returning-non-void-assignable-to-function-returning-void