code: private static void updatePropertyTypeMap(
        FunctionType type, Map<String, JSType> propTypeMap, HashSet<FunctionType> cache) {
      if (type == null) {
        return;
      }
      // retrieve all property types on the prototype of this class
      ObjectType prototype = type.getPrototype();
      if (prototype != null) {
        Set<String> propNames = prototype.getOwnPropertyNames();
        for (String name : propNames) {
          if (!propTypeMap.containsKey(name)) {
            JSType propType = prototype.getPropertyType(name);
            propTypeMap.put(name, propType);
          }
        }
      }
      // retrieve all property types from its super class
      Iterable<ObjectType> iterable = type.getExtendedInterfaces();
      if (iterable != null) {
        for (ObjectType interfaceType : iterable) {
          FunctionType superConstructor = interfaceType.getConstructor();
          if (superConstructor == null || cache.contains(superConstructor)) {
            continue;
          }
          cache.add(superConstructor);
          updatePropertyTypeMap(superConstructor, propTypeMap, cache);
          cache.remove(superConstructor);
        }
      }
    }
docs: the super type: see testInterfaceExtendsLoop in TypeCheckTest.java