Skip to content

Commit 5a21291

Browse files
authored
Propegate contextual types through nonnull assertion operators (#42526)
1 parent d2443a5 commit 5a21291

5 files changed

+28
-0
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24757,6 +24757,8 @@ namespace ts {
2475724757
const tag = isInJSFile(parent) ? getJSDocTypeTag(parent) : undefined;
2475824758
return tag ? getTypeFromTypeNode(tag.typeExpression.type) : getContextualType(<ParenthesizedExpression>parent, contextFlags);
2475924759
}
24760+
case SyntaxKind.NonNullExpression:
24761+
return getContextualType(parent as NonNullExpression, contextFlags);
2476024762
case SyntaxKind.JsxExpression:
2476124763
return getContextualTypeForJsxExpression(<JsxExpression>parent);
2476224764
case SyntaxKind.JsxAttribute:
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//// [nonnullAssertionPropegatesContextualType.ts]
2+
let rect2: SVGRectElement = document.querySelector('.svg-rectangle')!; // Error: Element
3+
4+
//// [nonnullAssertionPropegatesContextualType.js]
5+
"use strict";
6+
var rect2 = document.querySelector('.svg-rectangle'); // Error: Element
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/compiler/nonnullAssertionPropegatesContextualType.ts ===
2+
let rect2: SVGRectElement = document.querySelector('.svg-rectangle')!; // Error: Element
3+
>rect2 : Symbol(rect2, Decl(nonnullAssertionPropegatesContextualType.ts, 0, 3))
4+
>SVGRectElement : Symbol(SVGRectElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
5+
>document.querySelector : Symbol(ParentNode.querySelector, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
6+
>document : Symbol(document, Decl(lib.dom.d.ts, --, --))
7+
>querySelector : Symbol(ParentNode.querySelector, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --))
8+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
=== tests/cases/compiler/nonnullAssertionPropegatesContextualType.ts ===
2+
let rect2: SVGRectElement = document.querySelector('.svg-rectangle')!; // Error: Element
3+
>rect2 : SVGRectElement
4+
>document.querySelector('.svg-rectangle')! : SVGRectElement
5+
>document.querySelector('.svg-rectangle') : SVGRectElement | null
6+
>document.querySelector : { <K extends keyof HTMLElementTagNameMap>(selectors: K): HTMLElementTagNameMap[K] | null; <K extends keyof SVGElementTagNameMap>(selectors: K): SVGElementTagNameMap[K] | null; <E extends Element = Element>(selectors: string): E | null; }
7+
>document : Document
8+
>querySelector : { <K extends keyof HTMLElementTagNameMap>(selectors: K): HTMLElementTagNameMap[K] | null; <K extends keyof SVGElementTagNameMap>(selectors: K): SVGElementTagNameMap[K] | null; <E extends Element = Element>(selectors: string): E | null; }
9+
>'.svg-rectangle' : ".svg-rectangle"
10+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @strict: true
2+
let rect2: SVGRectElement = document.querySelector('.svg-rectangle')!; // Error: Element

0 commit comments

Comments
 (0)