No did-you-mean-to-call error on casts

I chose to do the ad-hoc check rather than yet another tree walk.

1. It's faster to run and easier to read.
2. This error came from looking at real code. It happened twice, so I
think the best estimate for other uses that happened zero times is in
fact zero.
3. I couldn't think of other places to put the cast, given the
restrictions on `testedNode` just before the new code.
This commit is contained in:
Nathan Shively-Sanders
2021-02-03 11:32:48 -08:00
parent 1c25b009f2
commit 214ef0c750
5 changed files with 83 additions and 1 deletions
+4 -1
View File
@@ -34554,8 +34554,11 @@ namespace ts {
: isPropertyAccessExpression(location) ? location.name
: isBinaryExpression(location) && isIdentifier(location.right) ? location.right
: undefined;
const isPropertyExpressionCast = isPropertyAccessExpression(location)
&& isParenthesizedExpression(location.expression)
&& isAssertionExpression(location.expression.expression);
if (!testedNode) {
if (!testedNode || isPropertyExpressionCast) {
return;
}
@@ -0,0 +1,19 @@
//// [truthinessCallExpressionCoercion3.ts]
// from #41640, based on an example in ant-design
interface I {
always(): void
}
function f(result: unknown) {
if ((result as I).always) {
return result
}
}
//// [truthinessCallExpressionCoercion3.js]
function f(result) {
if (result.always) {
return result;
}
}
@@ -0,0 +1,24 @@
=== tests/cases/compiler/truthinessCallExpressionCoercion3.ts ===
// from #41640, based on an example in ant-design
interface I {
>I : Symbol(I, Decl(truthinessCallExpressionCoercion3.ts, 0, 0))
always(): void
>always : Symbol(I.always, Decl(truthinessCallExpressionCoercion3.ts, 1, 13))
}
function f(result: unknown) {
>f : Symbol(f, Decl(truthinessCallExpressionCoercion3.ts, 3, 1))
>result : Symbol(result, Decl(truthinessCallExpressionCoercion3.ts, 5, 11))
if ((result as I).always) {
>(result as I).always : Symbol(I.always, Decl(truthinessCallExpressionCoercion3.ts, 1, 13))
>result : Symbol(result, Decl(truthinessCallExpressionCoercion3.ts, 5, 11))
>I : Symbol(I, Decl(truthinessCallExpressionCoercion3.ts, 0, 0))
>always : Symbol(I.always, Decl(truthinessCallExpressionCoercion3.ts, 1, 13))
return result
>result : Symbol(result, Decl(truthinessCallExpressionCoercion3.ts, 5, 11))
}
}
@@ -0,0 +1,23 @@
=== tests/cases/compiler/truthinessCallExpressionCoercion3.ts ===
// from #41640, based on an example in ant-design
interface I {
always(): void
>always : () => void
}
function f(result: unknown) {
>f : (result: unknown) => unknown
>result : unknown
if ((result as I).always) {
>(result as I).always : () => void
>(result as I) : I
>result as I : I
>result : unknown
>always : () => void
return result
>result : unknown
}
}
@@ -0,0 +1,13 @@
// @strictNullChecks: true
// @lib: esnext,dom
// from #41640, based on an example in ant-design
interface I {
always(): void
}
function f(result: unknown) {
if ((result as I).always) {
return result
}
}