Skip to content

Commit 460d1e2

Browse files
committed
Forward intersectionState flag when comparing indexed access constraints
1 parent 3c3909b commit 460d1e2

5 files changed

+98
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19658,7 +19658,7 @@ namespace ts {
1965819658
// create a new chain for the constraint error
1965919659
resetErrorInfo(saveErrorInfo);
1966019660
}
19661-
if (result = isRelatedTo(source, constraint, RecursionFlags.Target, reportErrors)) {
19661+
if (result = isRelatedTo(source, constraint, RecursionFlags.Target, reportErrors, /* headMessage */ undefined, intersectionState)) {
1966219662
return result;
1966319663
}
1966419664
// prefer the shorter chain of the constraint comparison chain, and the direct comparison chain
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//// [jsxIntrinsicElementsCompatability.tsx]
2+
/// <reference path="/.lib/react16.d.ts" />
3+
import * as React from "react";
4+
function SomeComponent<T extends 'button' | 'a'>(props: { element?: T } & JSX.IntrinsicElements[T]): JSX.Element {
5+
// Just so the return value is RectElement, the rendered element doesnt matter
6+
return <div />
7+
}
8+
9+
function Test<T extends 'button' | 'a'>(el: T) {
10+
return <SomeComponent element={el} />
11+
}
12+
13+
//// [jsxIntrinsicElementsCompatability.js]
14+
"use strict";
15+
exports.__esModule = true;
16+
/// <reference path="react16.d.ts" />
17+
var React = require("react");
18+
function SomeComponent(props) {
19+
// Just so the return value is RectElement, the rendered element doesnt matter
20+
return React.createElement("div", null);
21+
}
22+
function Test(el) {
23+
return React.createElement(SomeComponent, { element: el });
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
=== tests/cases/compiler/jsxIntrinsicElementsCompatability.tsx ===
2+
/// <reference path="react16.d.ts" />
3+
import * as React from "react";
4+
>React : Symbol(React, Decl(jsxIntrinsicElementsCompatability.tsx, 1, 6))
5+
6+
function SomeComponent<T extends 'button' | 'a'>(props: { element?: T } & JSX.IntrinsicElements[T]): JSX.Element {
7+
>SomeComponent : Symbol(SomeComponent, Decl(jsxIntrinsicElementsCompatability.tsx, 1, 31))
8+
>T : Symbol(T, Decl(jsxIntrinsicElementsCompatability.tsx, 2, 23))
9+
>props : Symbol(props, Decl(jsxIntrinsicElementsCompatability.tsx, 2, 49))
10+
>element : Symbol(element, Decl(jsxIntrinsicElementsCompatability.tsx, 2, 57))
11+
>T : Symbol(T, Decl(jsxIntrinsicElementsCompatability.tsx, 2, 23))
12+
>JSX : Symbol(JSX, Decl(react16.d.ts, 2493, 12))
13+
>IntrinsicElements : Symbol(JSX.IntrinsicElements, Decl(react16.d.ts, 2514, 86))
14+
>T : Symbol(T, Decl(jsxIntrinsicElementsCompatability.tsx, 2, 23))
15+
>JSX : Symbol(JSX, Decl(react16.d.ts, 2493, 12))
16+
>Element : Symbol(JSX.Element, Decl(react16.d.ts, 2494, 23))
17+
18+
// Just so the return value is RectElement, the rendered element doesnt matter
19+
return <div />
20+
>div : Symbol(JSX.IntrinsicElements.div, Decl(react16.d.ts, 2546, 114))
21+
}
22+
23+
function Test<T extends 'button' | 'a'>(el: T) {
24+
>Test : Symbol(Test, Decl(jsxIntrinsicElementsCompatability.tsx, 5, 1))
25+
>T : Symbol(T, Decl(jsxIntrinsicElementsCompatability.tsx, 7, 14))
26+
>el : Symbol(el, Decl(jsxIntrinsicElementsCompatability.tsx, 7, 40))
27+
>T : Symbol(T, Decl(jsxIntrinsicElementsCompatability.tsx, 7, 14))
28+
29+
return <SomeComponent element={el} />
30+
>SomeComponent : Symbol(SomeComponent, Decl(jsxIntrinsicElementsCompatability.tsx, 1, 31))
31+
>element : Symbol(element, Decl(jsxIntrinsicElementsCompatability.tsx, 8, 25))
32+
>el : Symbol(el, Decl(jsxIntrinsicElementsCompatability.tsx, 7, 40))
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
=== tests/cases/compiler/jsxIntrinsicElementsCompatability.tsx ===
2+
/// <reference path="react16.d.ts" />
3+
import * as React from "react";
4+
>React : typeof React
5+
6+
function SomeComponent<T extends 'button' | 'a'>(props: { element?: T } & JSX.IntrinsicElements[T]): JSX.Element {
7+
>SomeComponent : <T extends "a" | "button">(props: { element?: T;} & JSX.IntrinsicElements[T]) => JSX.Element
8+
>props : { element?: T | undefined; } & JSX.IntrinsicElements[T]
9+
>element : T | undefined
10+
>JSX : any
11+
>JSX : any
12+
13+
// Just so the return value is RectElement, the rendered element doesnt matter
14+
return <div />
15+
><div /> : JSX.Element
16+
>div : any
17+
}
18+
19+
function Test<T extends 'button' | 'a'>(el: T) {
20+
>Test : <T extends "a" | "button">(el: T) => JSX.Element
21+
>el : T
22+
23+
return <SomeComponent element={el} />
24+
><SomeComponent element={el} /> : JSX.Element
25+
>SomeComponent : <T extends "a" | "button">(props: { element?: T | undefined; } & JSX.IntrinsicElements[T]) => JSX.Element
26+
>element : T
27+
>el : T
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// @strict: true
2+
// @jsx: react
3+
/// <reference path="/.lib/react16.d.ts" />
4+
import * as React from "react";
5+
function SomeComponent<T extends 'button' | 'a'>(props: { element?: T } & JSX.IntrinsicElements[T]): JSX.Element {
6+
// Just so the return value is RectElement, the rendered element doesnt matter
7+
return <div />
8+
}
9+
10+
function Test<T extends 'button' | 'a'>(el: T) {
11+
return <SomeComponent element={el} />
12+
}

0 commit comments

Comments
 (0)