Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

265
Vistas
createPortal - TypeScript document.getElementById type issue when JavaScript runs fine?

I'm trying to use ReactDOM.createPortal and neither 'ReactDOM' or 'document' is highlighted in VSCode and I get this error when hovering over 'document.getElementById('overlay-root')':

Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Element'.
  Type 'null' is not assignable to type 'Element'.

Here's the code:

import styles from './CartModal.module.css';
import ReactDOM from 'react-dom';
import Card from '../UI/Card/Card';

interface CartModalProps {
  onClose?: () => void
}

const DisplayCartModal: React.FC<CartModalProps> = (props) => {

  return ReactDOM.createPortal(
    <>
      <CartModal />
    </>, 
    document.getElementById('overlay-root')
  )
}

export default DisplayCartModal;

I've tried switching the file extension to .js to see if this is a TypeScript error and indeed when I changed it (and removed TS-specific syntax) everything was highlighted and worked perfectly. It did not return null, it returned the correct HTML Element. Help is greatly appreciated!

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

The issue is, document.getElementById('overlay-root') might be null. You (I assume) know that it will not be, but Typescript does not know that.

You can assert that not-null-ness with an exclamation mark, like so:

ReactDOM.createPortal(
<>
  <CartModal />
</>, 
document.getElementById('overlay-root')!
)

If your assertion is false, you will get a run-time error, a very bad thing.

about 4 years ago · Juan Pablo Isaza Denunciar

0

In typescript, createPortal receive container of type Element:

export function createPortal(children: ReactNode, container: Element, key?: null | string): ReactPortal;

Meanwhile, document.querySelector return an Element OR Null

querySelector<E extends Element = Element>(selectors: string): E | null;

This is a mismatch for both, to fix this, you will need to cast the return object from querySelector

document.querySelector('#overlay-root') as Element,

But for the sake of catching any errors, you should check for null before using it so you won't have to cast at all:

const DisplayCartModal: React.FC<CartModalProps> = (props) => {
  const overlayRootEl = document.querySelector('#overlay-root');

  return overlayRootEl
    ? ReactDOM.createPortal(
      <>
        <CartModal />
      </>,
      overlayRootEl,
    )
    : null;
};
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda