In the end I decided to use something along the lines of this quacksLike solution http://fitzgeraldnick.com/weblog/39/.
For each logical "interface" I create an object which lists members along with very basic type indication using JS prototypes (String, Number, Function etc.). This interface objects are very easy to document with JSDoc (also to add missing information about method parameters).
When working with target objects, I check if object intends to support the "interface" and if so, I go ahead and call methods. It's not as safe as static typing, but good enough for me.
var interfaces = {
...
validatable: {
validate: Function,
isValid: Boolean,
getValidationMessages: Function
}
....
}
...
if (typing.checkSupport(control, interfaces.validatable)) {
control.validate();
if (!control.isValid) {
....
}
}