I have a function that is returning either an `class instance` or `None` depending
on some logic.
In some places of the code I know this function is for sure not returning `None`,
but mypy complains.

I made a minimal example that reproduces the situation described above. 

I would like to avoid marking `a_string` as `a_string: Optional[str] = ""`, I
know I can also overcome the problem using `cast` or `type ignore`, but somehow I
feel there might be a better way.

Any recommendations how to handle this situation?

For this example I am using `mypy 0.641` and `python 3.7`

```
"""
Function returns either an object or none

"""

from typing import Optional, cast

RET_NONE = False

def minimal_example() -> Optional[str]:
    if RET_NONE:
        return None
    else:
        return "my string"

a_string = ""
maybe_string = minimal_example()
a_string = maybe_string

# mypy doesn't complain if I do the following
a_string = cast(str, maybe_string)
a_string = maybe_string  # type: ignore

```

Mypy complains as follows:

```
❯❯❯   mypy mypy_none_or_object.py                                                                                                                                                                         (chatsalot)  ✘ 1
mypy_none_or_object.py:19: error: Incompatible types in assignment (expression has type "Optional[str]", variable has type "str")

```