code: @Nullable
    public final JSType findPropertyType(String propertyName) {
      @Nullable JSType propertyType = findPropertyTypeWithoutConsideringTemplateTypes(propertyName);
      if (propertyType == null) {
        return null;
      }
  
      // Do templatized type replacing logic here, and make this method final, to prevent a subclass
      // from forgetting to replace template types
      if (getTemplateTypeMap().isEmpty() || !propertyType.hasAnyTemplateTypes()) {
        return propertyType;
      }
  
      TemplateTypeMap typeMap = getTemplateTypeMap();
      TemplateTypeMapReplacer replacer = new TemplateTypeMapReplacer(registry, typeMap);
      return propertyType.visit(replacer);
    }
docs: Coerces this type to an Object type, then gets the type of the property whose name is given.
  
  <p>Unlike {@link ObjectType#getPropertyType}, returns null if the property is not found.
  
  @return The property's type. {@code null} if the current type cannot have properties, or if the
  type is not found.