What is the proper way to define h.JSX for built-in HTML components?

Is it possible to specify a custom h.JSX declaration instead of using global.JSX? How can I achieve this?

The playground example provided fails, what steps should be taken to fix it?

Although the TypeScript documentation states that h.JSX should take precedence over global.JSX, it doesn't seem to work as intended. Here's a quote from the TS docs:

If the factory is defined as React.createElement (the default), the compiler will check for React.JSX before checking for a global JSX. If the factory is defined as h, it will check for h.JSX before a global JSX.

/** @jsx h */

interface ElBuilder {
  (tag: any, attrs: Record<string, any> | null, ...content: any[]): any
  JSX(tag: any, attrs: Record<string, any> | null, ...content: any[]): any
}

const h: ElBuilder = function(tag, attrs, ...content) {
  console.log('h', tag, attrs, content)
}
h.JSX = h

console.log(<div></div>)
// ^Error: JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists.ts(7026)

Answer №1

Resolution

/** @jsx h */

export namespace h {
  export namespace JSX {
    export interface IntrinsicElements {
      [element: string]: any
    }
  }
}

interface ElementBuilder {
  (element: any, attributes: Record<string, any> | null, ...children: any[]): any
}

const h: ElementBuilder = function(element, attributes, ...children) {
  console.log('h', element, attributes, children)
}

console.log(<div></div>)

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Typescript's puzzling selection of the incorrect overload

I have a method structured as shown below: class Bar { public executeInWorker(cb: () => void): void; public executeInWorker(cb: () => Promise<void>): void | Promise<void>; public executeInWorker(cb: () => void | Promise< ...

Retrieving child component's data property in Vue 3 using TypeScript and Composition API

I have set up two components: a parent and a child. App.vue //Parent <template> <div class="common-layout"> <Container> <Header><center>Vue JS 3 (Composition API and )</center></Header> ...

Encountering issues with dependencies while updating React results in deployment failure for the React app

Ever since upgrading React to version 18, I've been encountering deployment issues. Despite following the documentation and scouring forums for solutions, I keep running into roadblocks with no success. The errors displayed are as follows: $ npm i np ...

The response of the Typescript Subscription function

I'm struggling with retrieving the subscribe array in NG2. Being new to typescript, I find it difficult to understand how to pass variables between functions and constructors. This is what my code currently looks like: export class RosterPage exten ...

Update the registerForm input from a boolean value to a number

Confused about how to convert a boolean to a number Issue : I'm struggling trying to convert my registerForm.value.aleas, which is a checkbox, into a number (0 for false, 1 for true) in order to perform a POST request (the API expects values of eith ...

Using a loop variable within a callback function in JavaScript/TypeScript: Tips and tricks

I have a method in my TypeScript file that looks like this: getInitialBatches() { var i = 0; for (var dto of this.transferDTO.stockMovesDTOs) { i++; this.queryResourceService .getBatchIdUsingGET(this.batchParams) ...

When using ngFor, a conversion from a string literal type to a regular string occurs, resulting in an error that states: "Element implicitly has an 'any' type because an expression of type 'string' cannot be utilized..."

When utilizing the iterator *ngFor, it converts a string union literal type ("apple" | "banana") to a string type. However, when attempting to use it as an index of an array expecting the correct string union literal type, an error occu ...

What is the best method for implementing Datepicker translations in Angular?

I am looking to incorporate the DatePicker component in Angular, enabling users to select a date that can be translated based on their browser's settings. Any suggestions on how to achieve this? <mat-form-field appearance="fill"> ...

When trying to ctrl-click on paths in Visual Studio Code, the resolution is incorrect

I'm currently working on customizing a library by modifying its source code. I've downloaded the source code and now I'm trying to configure vscode, typescript, and webpack to recognize that file. Although I've successfully aliased the ...

The successful conversion of Typescript to a number is no longer effective

Just the other day, I was successfully converting strings to numbers with no issues. However, today things have taken a turn for the worse. Even after committing my changes thinking all was well, I now find that when attempting to cast in different ways, I ...

Look for identical values within a nested array

My data consists of a nested array where each element has a property called name, which can only be either A or B. I need to compare all elements and determine if they are all either A or B. Here is an example of the input: [ { "arr": { "teach ...

Sortable layouts and tables in Ionic 3

I found a great example of an Ionic table that I'm using as reference: https://codepen.io/anon/pen/pjzKMZ <ion-content> <div class="row header"> <div class="col">Utility Company Name</div> <div c ...

Providing a function with an incorrect variable type does not trigger a type error

Why is it that when I pass the incorrect variable type to the ts function, no type error is emitted? export class CreateCategoryDto implements Omit<Category, 'id' | 'children' | 'parent'> { name: string; parentId: ...

The identifier has not been properly specified

As a newcomer to Angular 9, I am currently working on developing an application. However, I have encountered some issues with defining properties and would greatly appreciate any assistance provided. Here's an overview of my project: https://i.sstati ...

Under what circumstances would you need to manually specify the displayName of a React component?

After coming across an article (linked here: https://medium.com/@stevemao/do-not-use-anonymous-functions-to-construct-react-functional-components-c5408ec8f4c7) discussing the drawbacks of creating React components with arrow functions, particularly regardi ...

What is the solution to the error message "Unable to assign property of undefined"?

I am currently working on an angular countdown timer and encountering a TypeError when attempting to access a variable from another component. I am struggling to identify the root cause of this issue. Here is the video tutorial that I am using as a referen ...

Limit the keys in TypeScript to only the elements of an array

Modified: Updating ID Types I have an array that contains the following values: const ids: number[] = [45, 56]; const obj: any = { 45: "HELLO", 56: "WORLD", }; I want to specify a type for my object to only allow values that are in my ids array. I ...

Establishing the data type for the state coming from the API

Whenever I try to add a new API response to the status, it shows as undefined. I need to filter out the incoming data from randomcocktail and then put it to use. Random.tsx import { useState, useEffect } from "react"; import { CocktailType } ...

Generate a map that returns zero elements in a Typescript/Angular function

I recently started learning Angular and am currently working on a practice app. I have a feature where the app takes in a property file as input from HTML, processes the file, and stores the values in a map using TypeScript. While I can successfully store ...

Wait for each observable subscription to complete

In my scenario, I have an array called orderCodes, which stores specific order codes. With each code, I can retrieve the corresponding order details, where each order contains multiple products. My goal is to extract the code of each product from the order ...