mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-21 18:22:58 -05:00
Check return code paths on getters (#10102)
* Check return paths on getters * Remove TODO comment
This commit is contained in:
@@ -14126,12 +14126,7 @@ namespace ts {
|
||||
checkSignatureDeclaration(node);
|
||||
if (node.kind === SyntaxKind.GetAccessor) {
|
||||
if (!isInAmbientContext(node) && nodeIsPresent(node.body) && (node.flags & NodeFlags.HasImplicitReturn)) {
|
||||
if (node.flags & NodeFlags.HasExplicitReturn) {
|
||||
if (compilerOptions.noImplicitReturns) {
|
||||
error(node.name, Diagnostics.Not_all_code_paths_return_a_value);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!(node.flags & NodeFlags.HasExplicitReturn)) {
|
||||
error(node.name, Diagnostics.A_get_accessor_must_return_a_value);
|
||||
}
|
||||
}
|
||||
@@ -14161,7 +14156,10 @@ namespace ts {
|
||||
checkAccessorDeclarationTypesIdentical(node, otherAccessor, getThisTypeOfDeclaration, Diagnostics.get_and_set_accessor_must_have_the_same_this_type);
|
||||
}
|
||||
}
|
||||
getTypeOfAccessors(getSymbolOfNode(node));
|
||||
const returnType = getTypeOfAccessors(getSymbolOfNode(node));
|
||||
if (node.kind === SyntaxKind.GetAccessor) {
|
||||
checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnType);
|
||||
}
|
||||
}
|
||||
if (node.parent.kind !== SyntaxKind.ObjectLiteralExpression) {
|
||||
checkSourceElement(node.body);
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
tests/cases/compiler/getterControlFlowStrictNull.ts(2,9): error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
|
||||
tests/cases/compiler/getterControlFlowStrictNull.ts(11,14): error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/getterControlFlowStrictNull.ts (2 errors) ====
|
||||
class A {
|
||||
a(): string | null {
|
||||
~~~~~~~~~~~~~
|
||||
!!! error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// it does error here as expected
|
||||
}
|
||||
}
|
||||
class B {
|
||||
get a(): string | null {
|
||||
~~~~~~~~~~~~~
|
||||
!!! error TS2366: Function lacks ending return statement and return type does not include 'undefined'.
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// it should error here because it returns undefined
|
||||
}
|
||||
}
|
||||
47
tests/baselines/reference/getterControlFlowStrictNull.js
Normal file
47
tests/baselines/reference/getterControlFlowStrictNull.js
Normal file
@@ -0,0 +1,47 @@
|
||||
//// [getterControlFlowStrictNull.ts]
|
||||
class A {
|
||||
a(): string | null {
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// it does error here as expected
|
||||
}
|
||||
}
|
||||
class B {
|
||||
get a(): string | null {
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// it should error here because it returns undefined
|
||||
}
|
||||
}
|
||||
|
||||
//// [getterControlFlowStrictNull.js]
|
||||
var A = (function () {
|
||||
function A() {
|
||||
}
|
||||
A.prototype.a = function () {
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
// it does error here as expected
|
||||
};
|
||||
return A;
|
||||
}());
|
||||
var B = (function () {
|
||||
function B() {
|
||||
}
|
||||
Object.defineProperty(B.prototype, "a", {
|
||||
get: function () {
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
// it should error here because it returns undefined
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
return B;
|
||||
}());
|
||||
20
tests/cases/compiler/getterControlFlowStrictNull.ts
Normal file
20
tests/cases/compiler/getterControlFlowStrictNull.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
//@strictNullChecks: true
|
||||
//@target: ES5
|
||||
class A {
|
||||
a(): string | null {
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// it does error here as expected
|
||||
}
|
||||
}
|
||||
class B {
|
||||
get a(): string | null {
|
||||
if (Math.random() > 0.5) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// it should error here because it returns undefined
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user