microsoft / microsoft/TypeScript

Cannot use type side of a namespace in JsDoc after `declare global ...` workaround for UMD globals

Abierto
#26,486 1 comentario 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Domain: JSDoc
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
1 d 19 h
PR fusionados (30 d)
117

Descripción

I hit this while writing an electron app using checkJs where you can both require code in (thus making your file a module), and there may also be script tags loading code in the HTML for the app. For example, by main page has the below as it is using D3. Thus the 'd3' object is available globally.

    <script src="node_modules/d3/dist/d3.js"></script>
    <script src="./app.js"></script>

Trying to use the global D3 in my app.js however results in the error 'd3' refers to a UMD global, but the current file is a module..., so I've added the common workaround below to avoid this via a .d.ts file.

import {default as _d3} from 'd3';


declare global {
    // Make the global d3 from directly including the bundle via a script tag available as a global
    const d3: typeof _d3;
}

When the above .d.ts code is present (and only when), JSDoc gives an error on trying to use types from the namespace, i.e. the below code

/** @type {d3.DefaultArcObject} */
var x;

Results in the error Namespace '"./@types/d3/index".d3' has no exported member 'DefaultArcObject'. Yet the below TypeScript continues to work fine:

var x: d3.DefaultArcObject;

The below also continues to work fine in JavaScript, but is kind of ugly and a pain to have to repeat (especially if you need to use a lot of type arguments)

/** @type {import('d3').DefaultArcObject} */
var x;

Personally I'd rather not have to do the .d.ts workaround at all and just be able to use the d3 global in my modules (see the highly controversial #10178). That not being the case, JsDoc should be able to access the types still with the workaround in place.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Empieza reproduciendo el caso de checkJs usando la declaración global en .d.ts, app.js y la referencia JSDoc a d3.DefaultArcObject. Compara la búsqueda JSDoc que falla con la anotación de TypeScript que funciona y la forma import('d3'). Se considera terminado cuando el tipo del espacio de nombres se resuelve mediante la declaración global sin el error indicado.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
d3, electron, javascript, typescript
Área
compilers, developer-experience
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.