No, you don't have to cast it 🙂
Here's a quick test, in a document with an active sketch:
import adsk.core
import adsk.fusion
def run(_):
sketch = adsk.core.Application.get().activeEditObject
print(sketch)
print(type(sketch).__name__)
sketch = adsk.fusion.Sketch.cast(sketch)
print(sketch)
print(type(sketch).__name__)
Which results in:
<adsk.fusion.Sketch; proxy of <Swig Object of type 'std::vector< adsk::core::Ptr< adsk::fusion::Sketch > >::value_type *' at 0x000001CFA6ABC300> >
Sketch
<adsk.fusion.Sketch; proxy of <Swig Object of type 'std::vector< adsk::core::Ptr< adsk::fusion::Sketch > >::value_type *' at 0x000001CFA6ABC300> >
Sketch
As you can see, the object was already a sketch before the cast.
Furthermore, you can take a look at the implementation of the cast method itself. i.e. in <Autodesk>\webdeploy\production\<GUID>\Api\Python\packages\adsk\fusion.py
Sketch.cast = lambda arg: arg if isinstance(arg, Sketch) else None
As you can see, it just returns the unmodified argument, as long as it is a sketch, of course.
Since Application.activeEditObject could be different types of objects, it's best to do a type check on it before using it. You could use Sketch.cast() and check the return value for None, or just do the isinstance check directly yourself.