I suppose you need interfaces/abstract classes for organizing complexity and type enforcement.
As @eska well mentioned, GDScript is made with simplicity in mind, hence no interfaces and no static type.
You could make an abstract class by just making a regular class and just not instantiate it but only extend from it. I do that to keep things organized. You're not constrained to not instantiate it, of course (which is good and bad).
My advice:
If you aim for a project of a size requiring these features, consider using the alternatives - C++, C#.
Otherwise you should be fine without checking for method existence, since you'd only have a handful of classes and methods.
Another way to consider is using signals.
If you're not satisfied with either of the approaches above, then whenever you want to implement an interface you'd make a dummy static method like static func implementsCrushable():pass
in the classes you want to implement the so called "interface", without any such "interface" actually existing.
Then whenever you'd call various methods on an object o
you'd write:
if o.has_method("implementsExplodable"):
if o.has_method("implementsCrushable"):
o.stainRoad()
points = o.pointsGranted # only crushable explodables grant points
else:
o.damage(self)
o.stainRoad() # homonym method of non-crushable explodable
...
o.explode()
This way you only need to check once for all (not each) of the methods of that "interface" when you call them. Plus you can see what is what.