diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 49581ff837743..f3f65bd7f0a88 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -18525,9 +18525,7 @@ namespace ts {
             const aggregatedTypes: Type[] = [];
             const isAsync = (getFunctionFlags(func) & FunctionFlags.Async) !== 0;
             forEachYieldExpression(<Block>func.body, yieldExpression => {
-                if (yieldExpression.expression) { // TODO: GH#22297
-                    pushIfUnique(aggregatedTypes, getYieldedTypeOfYieldExpression(yieldExpression, isAsync, checkMode));
-                }
+                pushIfUnique(aggregatedTypes, getYieldedTypeOfYieldExpression(yieldExpression, isAsync, checkMode));
             });
             return aggregatedTypes;
         }
@@ -19520,8 +19518,6 @@ namespace ts {
                 }
             }
 
-            if (!node.expression) return anyType; // TODO: GH#22297
-
             const isAsync = (functionFlags & FunctionFlags.Async) !== 0;
             const yieldedType = getYieldedTypeOfYieldExpression(node, isAsync);
             // There is no point in doing an assignability check if the function
diff --git a/tests/baselines/reference/generatorTypeCheck48.errors.txt b/tests/baselines/reference/generatorTypeCheck48.errors.txt
index 867a0c35f6045..a3a9706175f26 100644
--- a/tests/baselines/reference/generatorTypeCheck48.errors.txt
+++ b/tests/baselines/reference/generatorTypeCheck48.errors.txt
@@ -1,9 +1,17 @@
-tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts(1,9): error TS7025: Generator implicitly has type 'IterableIterator<any>' because it does not yield any values. Consider supplying a return type.
+tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts(1,11): error TS7010: 'g', which lacks return-type annotation, implicitly has an 'any' return type.
+tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts(5,11): error TS7010: 'h', which lacks return-type annotation, implicitly has an 'any' return type.
 
 
-==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts (1 errors) ====
+==== tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts (2 errors) ====
     function* g() {
-            ~
-!!! error TS7025: Generator implicitly has type 'IterableIterator<any>' because it does not yield any values. Consider supplying a return type.
+              ~
+!!! error TS7010: 'g', which lacks return-type annotation, implicitly has an 'any' return type.
         yield;
-    }
\ No newline at end of file
+    }
+    
+    function* h() {
+              ~
+!!! error TS7010: 'h', which lacks return-type annotation, implicitly has an 'any' return type.
+        yield undefined;
+    }
+    
\ No newline at end of file
diff --git a/tests/baselines/reference/generatorTypeCheck48.js b/tests/baselines/reference/generatorTypeCheck48.js
index f4ce9fbb3345d..a584681b93e68 100644
--- a/tests/baselines/reference/generatorTypeCheck48.js
+++ b/tests/baselines/reference/generatorTypeCheck48.js
@@ -1,9 +1,17 @@
 //// [generatorTypeCheck48.ts]
 function* g() {
     yield;
-}
+}
+
+function* h() {
+    yield undefined;
+}
+
 
 //// [generatorTypeCheck48.js]
 function* g() {
     yield;
 }
+function* h() {
+    yield undefined;
+}
diff --git a/tests/baselines/reference/generatorTypeCheck48.symbols b/tests/baselines/reference/generatorTypeCheck48.symbols
index 323f799abe187..44254586ad90d 100644
--- a/tests/baselines/reference/generatorTypeCheck48.symbols
+++ b/tests/baselines/reference/generatorTypeCheck48.symbols
@@ -4,3 +4,11 @@ function* g() {
 
     yield;
 }
+
+function* h() {
+>h : Symbol(h, Decl(generatorTypeCheck48.ts, 2, 1))
+
+    yield undefined;
+>undefined : Symbol(undefined)
+}
+
diff --git a/tests/baselines/reference/generatorTypeCheck48.types b/tests/baselines/reference/generatorTypeCheck48.types
index e7c8f0ed01f3c..f07131595cdbc 100644
--- a/tests/baselines/reference/generatorTypeCheck48.types
+++ b/tests/baselines/reference/generatorTypeCheck48.types
@@ -5,3 +5,12 @@ function* g() {
     yield;
 >yield : any
 }
+
+function* h() {
+>h : () => IterableIterator<any>
+
+    yield undefined;
+>yield undefined : any
+>undefined : undefined
+}
+
diff --git a/tests/baselines/reference/yieldExpression1.errors.txt b/tests/baselines/reference/yieldExpression1.errors.txt
new file mode 100644
index 0000000000000..c7d7192859ba8
--- /dev/null
+++ b/tests/baselines/reference/yieldExpression1.errors.txt
@@ -0,0 +1,16 @@
+tests/cases/compiler/yieldExpression1.ts(7,5): error TS2322: Type 'undefined' is not assignable to type 'number'.
+
+
+==== tests/cases/compiler/yieldExpression1.ts (1 errors) ====
+    function* a() {
+        yield;
+        yield 0;
+    }
+    
+    function* b(): IterableIterator<number> {
+        yield;
+        ~~~~~
+!!! error TS2322: Type 'undefined' is not assignable to type 'number'.
+        yield 0;
+    }
+    
\ No newline at end of file
diff --git a/tests/baselines/reference/yieldExpression1.js b/tests/baselines/reference/yieldExpression1.js
index e4d5748a7617d..67c329010e12b 100644
--- a/tests/baselines/reference/yieldExpression1.js
+++ b/tests/baselines/reference/yieldExpression1.js
@@ -1,9 +1,21 @@
 //// [yieldExpression1.ts]
-function* foo() {
-    yield
-}
+function* a() {
+    yield;
+    yield 0;
+}
+
+function* b(): IterableIterator<number> {
+    yield;
+    yield 0;
+}
+
 
 //// [yieldExpression1.js]
-function* foo() {
+function* a() {
+    yield;
+    yield 0;
+}
+function* b() {
     yield;
+    yield 0;
 }
diff --git a/tests/baselines/reference/yieldExpression1.symbols b/tests/baselines/reference/yieldExpression1.symbols
index 7ca4678804740..fb7c2b585f8c0 100644
--- a/tests/baselines/reference/yieldExpression1.symbols
+++ b/tests/baselines/reference/yieldExpression1.symbols
@@ -1,6 +1,16 @@
 === tests/cases/compiler/yieldExpression1.ts ===
-function* foo() {
->foo : Symbol(foo, Decl(yieldExpression1.ts, 0, 0))
+function* a() {
+>a : Symbol(a, Decl(yieldExpression1.ts, 0, 0))
 
-    yield
+    yield;
+    yield 0;
 }
+
+function* b(): IterableIterator<number> {
+>b : Symbol(b, Decl(yieldExpression1.ts, 3, 1))
+>IterableIterator : Symbol(IterableIterator, Decl(lib.es2015.iterable.d.ts, --, --))
+
+    yield;
+    yield 0;
+}
+
diff --git a/tests/baselines/reference/yieldExpression1.types b/tests/baselines/reference/yieldExpression1.types
index 1ef54eb5f3d27..d774004637f3b 100644
--- a/tests/baselines/reference/yieldExpression1.types
+++ b/tests/baselines/reference/yieldExpression1.types
@@ -1,7 +1,24 @@
 === tests/cases/compiler/yieldExpression1.ts ===
-function* foo() {
->foo : () => IterableIterator<any>
+function* a() {
+>a : () => IterableIterator<0 | undefined>
 
-    yield
+    yield;
 >yield : any
+
+    yield 0;
+>yield 0 : any
+>0 : 0
 }
+
+function* b(): IterableIterator<number> {
+>b : () => IterableIterator<number>
+>IterableIterator : IterableIterator<T>
+
+    yield;
+>yield : any
+
+    yield 0;
+>yield 0 : any
+>0 : 0
+}
+
diff --git a/tests/cases/compiler/yieldExpression1.ts b/tests/cases/compiler/yieldExpression1.ts
index 1f2137b8403d6..ef5b543930df1 100644
--- a/tests/cases/compiler/yieldExpression1.ts
+++ b/tests/cases/compiler/yieldExpression1.ts
@@ -1,4 +1,12 @@
 // @target: es6
-function* foo() {
-    yield
-}
\ No newline at end of file
+// @strictNullChecks: true
+
+function* a() {
+    yield;
+    yield 0;
+}
+
+function* b(): IterableIterator<number> {
+    yield;
+    yield 0;
+}
diff --git a/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts b/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts
index 65885f28a5bd7..11c5ecfb8006b 100644
--- a/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts
+++ b/tests/cases/conformance/es6/yieldExpressions/generatorTypeCheck48.ts
@@ -3,4 +3,8 @@
 
 function* g() {
     yield;
-}
\ No newline at end of file
+}
+
+function* h() {
+    yield undefined;
+}