javascript - Cómo importar información de tipo en un módulo destinado a ser cargado en navegadores
Tengo un módulo sencillo que genera un componente de React:
// index.tsx
import * as React from "react";
import * as ReactDOM from "react-dom";
....
ReactDOM.render(......);
react y react-dom están en directorios en node_modules\@types.
Uso el compilador de TypeScript para compilar esto en un archivo .js. Ese archivo .js contiene un módulo (debido a las importaciones). Lo cargo en una página .html:
<script type="module" src="./js/Views/Home/index.js"></script>
Esto compila, y obtengo IntelliSense y verificación de tipos. Pero Chrome (versión 66) ahora lanza un error en la consola, diciendo
(index):1 Uncaught TypeError: Failed to resolve module specifier "react". Relative references must start with either "/", "./", or "../".
Probé estas opciones:
1) Variables ambientales
// this works for both compiler and browser, but doesn't give me type checking or intellisense
declare var ReactDOM: any;
declare var React: any;
2) Ninguna declaración
Según https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types, esto recogerá cualquier declaración de @types de node_modules en el directorio actual, directorio padre, etc. Lo cual suena genial, pero me da el error del compilador:
'ReactDOM' refers to a UMD global, but the current file is a module. Consider adding an import instead.
3) Directiva de triple barra
/// <reference path="../../node_modules/@types/react-dom/index.d.ts" />
Poner esto en la parte superior del archivo también produjo el error del compilador
'ReactDOM' refers to a UMD global, but the current file is a module. Consider adding an import instead.
4) Especificar tipos en el archivo tsconfig.json
// Added to tsconfig.json, compilerOptions element
"types": [ "ReactDOM", "React" ]
El compilador ahora arroja muchos mensajes de error "(TS) Identificador duplicado ....".
5) Importar directamente archivos .d.ts
import * as React from "../../node_modules/@types/react/index.d.ts";
import * as ReactDOM from "../../node_modules/@types/react-dom/index.d.ts";
Esto me da el error del compilador:
An import path cannot end with a '.d.ts' extension. Consider importing '../../node_modules/@types/react/index' instead.
6) Importa directamente los archivos .d.ts, pero omite la extensión .d.ts
import * as React from "../../node_modules/@types/react/index";
import * as ReactDOM from "../../node_modules/@types/react-dom/index";
Esto se compila. Pero el navegador ahora lanza el mensaje de error:
index.tsx:1 GET http://localhost:8400/js/node_modules/@types/react/index 404 (Not Found)
index.tsx:2 GET http://localhost:8400/js/node_modules/@types/react-dom/index 404 (Not Found)
Mi pregunta es, ¿cómo puedo importar información de tipo en un módulo que debe ser cargado por el navegador?