complete type checking whit recursive support