code: function getElementTypeOfIterator(type, errorNode) {
              if (isTypeAny(type)) {
                  return undefined;
              }
              var typeAsIterator = type;
              if (!typeAsIterator.iteratorElementType) {
                  // As an optimization, if the type is instantiated directly using the globalIteratorType (Iterator<number>),
                  // then just grab its type argument.
                  if ((type.flags & 131072 /* Reference */) && type.target === getGlobalIteratorType()) {
                      typeAsIterator.iteratorElementType = type.typeArguments[0];
                  }
                  else {
                      var iteratorNextFunction = getTypeOfPropertyOfType(type, "next");
                      if (isTypeAny(iteratorNextFunction)) {
                          return undefined;
                      }
                      var iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, 0 /* Call */) : emptyArray;
                      if (iteratorNextFunctionSignatures.length === 0) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.An_iterator_must_have_a_next_method);
                          }
                          return undefined;
                      }
                      var iteratorNextResult = getUnionType(ts.map(iteratorNextFunctionSignatures, getReturnTypeOfSignature), /*subtypeReduction*/ true);
                      if (isTypeAny(iteratorNextResult)) {
                          return undefined;
                      }
                      var iteratorNextValue = getTypeOfPropertyOfType(iteratorNextResult, "value");
                      if (!iteratorNextValue) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property);
                          }
                          return undefined;
                      }
                      typeAsIterator.iteratorElementType = iteratorNextValue;
                  }
              }
              return typeAsIterator.iteratorElementType;
          }
docs: This function has very similar logic as getElementTypeOfIterable, except that it operates on
  Iterators instead of Iterables. Here is the structure:
  
  { // iterator
  next: { // iteratorNextFunction
  (): { // iteratorNextResult
  value: T // iteratorNextValue
  }
  }
  }