mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-15 03:23:08 -06:00
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:
parent
e72c015bca
commit
f2bcb2101b
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
13
tests/cases/compiler/truthinessCallExpressionCoercion3.ts
Normal file
13
tests/cases/compiler/truthinessCallExpressionCoercion3.ts
Normal 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
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user