typescript - La ruta de referencia no captura la interfaz al usar import - IntelliJ
Estructura de Archivos
frontend
| static
| ts
| react
|components
AnotherFile.d.ts
Index.d.ts
Contexto
Cuando implemento AnotherFile.d.ts y Index.d.ts de la siguiente manera, IntelliJ no parece producir ningún error con respecto a estos dos archivos:
Index.d.ts
interface myFuncType {
(n: number): void;
}
OtroArchivo.d.ts
/// <reference path='./Index.d.ts'/>
interface AnotherType {
f: myFuncType
}
Ahora, si Index.d.ts importa y utiliza una clase de la siguiente manera, IntelliJ subraya en rojo 'myFuncType' en AnotherFile.d.ts con el error, TS2304: Cannot find name 'myFuncType'.
Index.d.ts
import {MyClass} from "static/ts/MyClass";
interface myFuncType {
(n: MyClass) : void;
}
OtroArchivo.d.ts
/// <reference path='./Index.d.ts'/>
interface AnotherType {
f: myFuncType;
}
Notas
- Si reemplazo la línea
...<reference path.../>en el segundo caso por AnotherFile.d.ts aimport {myFuncType} from "static/ts/react/components/Index";, el error desaparece, pero me pregunto si hay una manera de hacer que esto funcione usando...<reference path.../>. - Marcar frontEnd como 'Raíz de Recursos' parece ser la diferencia entre permitir el uso de rutas relativas en las líneas
import ...(por ejemplo,import {myFuncType} from "./Index"en lugar deimport {myFuncType} from "static/ts/react/components/Index";
Pregunta
¿Cómo puedo hacer que el segundo caso funcione sin introducir ninguna declaración de "import" en AnotherFile.d.ts?
Respuesta #1
Al agregar import a tu Index.d.ts lo conviertes en un módulo. A diferencia de los espacios de nombres, los módulos solo se pueden consumir importándolos explícitamente usando una de las formas de importación, de ahí el error del compilador.
Al definir tu interfaz (para lo que se supone que deben utilizarse los archivos d.ts), necesitas decidir qué tipo de aplicación estás desarrollando. Si es una aplicación modular, necesitas usar módulos. Para una aplicación global que se supone debe ser accesible desde el ámbito global (a través de <script src=...> en el navegador, por ejemplo), utiliza espacios de nombres. Mezclar ambos en el mismo código no funcionará.
Consulta https://www.typescriptlang.org/docs/handbook/declaration-files/library-structures.html para más información