No did-you-mean-to-call error on casts (#42626)

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-12 09:36:55 -08:00 committed by GitHub
parent e72c015bca
commit f2bcb2101b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 1 deletions

View File

@ -34546,8 +34546,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;
}

View File

@ -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;
}
}

View File

@ -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))
}
}

View File

@ -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
}
}

View File

@ -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
}
}