code: public TypePair getTypesUnderInequality(JSType that) {
      // unions types
      if (that.isUnionType()) {
        TypePair p = that.toMaybeUnionType().getTypesUnderInequality(this);
        return new TypePair(p.typeB, p.typeA);
      }
  
      // other types
      switch (testForEquality(that)) {
        case TRUE:
          JSType noType = getNativeType(JSTypeNative.NO_TYPE);
          return new TypePair(noType, noType);
  
        case FALSE:
        case UNKNOWN:
          return new TypePair(this, that);
      }
  
      // switch case is exhaustive
      throw new IllegalStateException();
    }
docs: Computes the subset of {@code this} and {@code that} types if inequality
  is observed. If a value {@code v1} of type {@code number} is not equal to a
  value {@code v2} of type {@code (undefined,number)}, we can infer that the
  type of {@code v1} is {@code number} and the type of {@code v2} is
  {@code number} as well.
  
  @return a pair containing the restricted type of {@code this} as the first
  component and the restricted type of {@code that} as the second
  element. The returned pair is never {@code null} even though its
  components may be {@code null}