error TS7026: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists. is reported for JSX elements when the checker has no JSX namespace telling it which elements and attributes exist. Under noImplicitAny the resulting any is an error, reported on each opening and closing tag.
The JSX types come from the framework: React's (@types/react), Preact's, Solid's. They are missing when the package is not installed, or when a types list or jsxImportSource points somewhere else.
At a glance
| Code | TS7026 |
|---|---|
| Message | JSX element implicitly has type 'any' because no interface 'JSX.{0}' exists. |
| TypeScript's category | error |
| Listed under | Classes, JSX and unused code |
| Turned on by | noImplicitAny, strict |
| In .js files | Reported when the file is checked: checkJs in jsconfig.json, or // @ts-check at the top of the file |
The message is TypeScript's own text from its diagnostic messages file (Apache-2.0); {0} is filled in by tsc for each error.
What it looks like
/** @param {{ name: string }} props */
export function Greeting({ name }) {
return <p className="greeting">Hello, {name}</p>;error TS7026: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.error TS7026: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.
}jsconfig.json for this example
{
"compilerOptions": {
"checkJs": true,
"noEmit": true,
"strict": true,
"target": "es2022",
"module": "nodenext",
"types": [],
"jsx": "preserve"
},
"include": ["*.jsx"]
} What causes it
jsxis set, but no package that declares theJSXnamespace is loaded.noImplicitAnyis on (part ofstrict).
How to fix it
Load the framework's JSX types
Install the types your JSX runtime publishes, and for an automatic runtime set jsxImportSource to the framework. For a project with its own small JSX runtime, declare the namespace yourself in a .d.ts file, as the fixed example does with a catch-all IntrinsicElements.
/** @param {{ name: string }} props */
export function Greeting({ name }) {
return <p className="greeting">Hello, {name}</p>;
}jsconfig.json for this example
{
"compilerOptions": {
"checkJs": true,
"noEmit": true,
"strict": true,
"target": "es2022",
"module": "nodenext",
"types": [],
"jsx": "preserve"
},
"include": ["*.jsx", "*.d.ts"]
} Gotchas
- A catch-all
IntrinsicElementsaccepts any element and attribute, so typos in tag names pass; real framework types check them. - Without any
jsxsetting the elements are also TS17004.
Sources
- JSX: Intrinsic elements · TypeScript handbook
- TSConfig Reference: jsxImportSource · TypeScript
- diagnosticMessages.json (TypeScript 5.9.3) · TypeScript on GitHub
Last reviewed 20 October 2026.