diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d33b94f42853d..7a163b110d1a1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -25881,11 +25881,11 @@ namespace ts { if (!links.resolvedJsxElementAttributesType) { const symbol = getIntrinsicTagSymbol(node); if (links.jsxFlags & JsxFlags.IntrinsicNamedElement) { - return links.resolvedJsxElementAttributesType = getTypeOfSymbol(symbol); + return links.resolvedJsxElementAttributesType = getTypeOfSymbol(symbol) || errorType; } else if (links.jsxFlags & JsxFlags.IntrinsicIndexedElement) { return links.resolvedJsxElementAttributesType = - getIndexTypeOfType(getDeclaredTypeOfSymbol(symbol), IndexKind.String)!; + getIndexTypeOfType(getJsxType(JsxNames.IntrinsicElements, node), IndexKind.String) || errorType; } else { return links.resolvedJsxElementAttributesType = errorType; diff --git a/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js new file mode 100644 index 0000000000000..2d444de1466df --- /dev/null +++ b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.js @@ -0,0 +1,35 @@ +//// [index.tsx] +export class X { + static jsx() { + return document.createElement('p'); + } +} + +export namespace X { + export namespace JSX { + export type IntrinsicElements = { + [other: string]: any; + }; + } +} + +function A() { + return (
Hello
); +} + +//// [index.js] +"use strict"; +exports.__esModule = true; +exports.X = void 0; +var X = /** @class */ (function () { + function X() { + } + X.jsx = function () { + return document.createElement('p'); + }; + return X; +}()); +exports.X = X; +function A() { + return (X.jsx("p", null, "Hello")); +} diff --git a/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols new file mode 100644 index 0000000000000..325e92dd818e8 --- /dev/null +++ b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.symbols @@ -0,0 +1,37 @@ +=== tests/cases/compiler/index.tsx === +export class X { +>X : Symbol(X, Decl(index.tsx, 0, 0), Decl(index.tsx, 4, 1)) + + static jsx() { +>jsx : Symbol(X.jsx, Decl(index.tsx, 0, 16)) + + return document.createElement('p'); +>document.createElement : Symbol(Document.createElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --)) +>document : Symbol(document, Decl(lib.dom.d.ts, --, --)) +>createElement : Symbol(Document.createElement, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --)) + } +} + +export namespace X { +>X : Symbol(X, Decl(index.tsx, 0, 0), Decl(index.tsx, 4, 1)) + + export namespace JSX { +>JSX : Symbol(JSX, Decl(index.tsx, 6, 20)) + + export type IntrinsicElements = { +>IntrinsicElements : Symbol(IntrinsicElements, Decl(index.tsx, 7, 26)) + + [other: string]: any; +>other : Symbol(other, Decl(index.tsx, 9, 13)) + + }; + } +} + +function A() { +>A : Symbol(A, Decl(index.tsx, 12, 1)) + + return (Hello
); +>p : Symbol(__type, Decl(index.tsx, 8, 39)) +>p : Symbol(__type, Decl(index.tsx, 8, 39)) +} diff --git a/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types new file mode 100644 index 0000000000000..f0841d84040c5 --- /dev/null +++ b/tests/baselines/reference/jsxLocalNamespaceIndexSignatureNoCrash.types @@ -0,0 +1,37 @@ +=== tests/cases/compiler/index.tsx === +export class X { +>X : X + + static jsx() { +>jsx : () => HTMLParagraphElement + + return document.createElement('p'); +>document.createElement('p') : HTMLParagraphElement +>document.createElement : {Hello
); +>(Hello
) : error +>Hello
: error +>p : any +>p : any +} diff --git a/tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx b/tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx new file mode 100644 index 0000000000000..b7d14efe3d618 --- /dev/null +++ b/tests/cases/compiler/jsxLocalNamespaceIndexSignatureNoCrash.tsx @@ -0,0 +1,21 @@ +// @jsx: react +// @jsxFactory: X.jsx +// @filename: index.tsx + +export class X { + static jsx() { + return document.createElement('p'); + } +} + +export namespace X { + export namespace JSX { + export type IntrinsicElements = { + [other: string]: any; + }; + } +} + +function A() { + return (Hello
); +} \ No newline at end of file