Estoy trabajando en un paquete que planeo publicar públicamente en npmjs. Llamémoslo el "paquete de texto".
Me gustaría que, de manera predeterminada, al instalar ese paquete, pueda importar archivos .txt directamente y obtener el tipo correcto (listo para usar), así:
import text from './file.txt' La variable de text sería de tipo string porque el paquete habría definido su tipo, usando algo como esto (en un global.d.ts):
declare module '*.txt' { export const text: string; export default text; } Si incluyo ese global.d.ts en mi paquete e importo algo de este paquete, automáticamente obtendré el tipo correcto al importar un archivo .txt .
Pero el problema es que a veces solo necesito importar un archivo .txt sin importar nada del "paquete de texto", razón por la cual me preguntaba si hay alguna forma, al instalar un paquete para instalar un tipo global que no requiere importar nada más para que se aplique el tipo.
En otras palabras, tan pronto como instale mi "paquete txt", el declare module '*.txt' se aplicará a todo mi proyecto de forma inmediata.
¿Hay alguna manera de hacer esto, o quien instale mi paquete tendría que declarar su propio tipo global (por ejemplo, declaraciones.d.ts) para poder importar archivos .txt globalmente?
Sé que incluso si el tipo de importación funciona, aún requerirá Webpack u otro paquete para que realmente funcione, pero esta pregunta es solo sobre el tipo.
La respuesta corta es:
TypeScript no admite tipos globales sin importar el archivo que hace referencia al tipo.
Más detalles:
Un ejemplo que encontré haciendo esto fue Next.js: al crear una aplicación TypeScript usando npx create-next-app@latest --typescript , puede comenzar a importar archivos *.css (por ejemplo) y obtener el tipo correcto.
Donde me confundí es que originalmente pensé que el tipo provenía de next-env.d.ts pero incluso cuando eliminé el archivo, la importación *.css todavía funcionaba en el código de Visual Studio. Pero la razón fue porque un archivo en el directorio de pages estaba importando el archivo index.d.ts de index.d.ts
Básicamente, en Visual Studio Code, tan pronto como importe un tipo en algún lugar de su proyecto, si es global, será accesible en todas partes.
Solución alterna
Entonces, ¿qué se puede hacer con las capacidades actuales de TypeScript? Para admitir nuevos tipos de archivos, necesitará un cargador de archivos como Webpack. Lo lógico sería agregar una referencia a la declaración del tipo de archivo en el propio cargador de archivos. De esta manera, tan pronto como configure su cargador de archivos para poder importar el archivo, heredará el tipo:
txt.d.ts en el directorio fuente de nuestro paquete (por ejemplo, src ); puede usar cualquier nombre para el archivo, no es importante'src/*.d.ts' en su opción ignorePatternsd.ts en su fuente que no está administrado por tsc , debe agregar una secuencia de comandos que realizará las siguientes acciones:txt.d.ts en el directorio de destino de los archivos compilados para su paqueteloader/index.d.ts : /// <reference types="../txt" />\r\n - esto vinculará el archivo de declaración nuevamente a su paquete Tenga en cuenta que puede agregar esta referencia a cualquier archivo de su paquete.Esta solución solo funcionará una vez que importe el archivo que hace referencia a la declaración; esta es la única forma en que TypeScript puede saber que este tipo existe (consulte https://github.com/microsoft/TypeScript/issues/49124 ).
Otra alternativa también podría ser agregar pasos manuales (en un archivo Léame) para agregar un archivo de declaración de tipo global.
para agrupar tipos globales, haga lo siguiente. formulario mecanografiado
"typeRoots": ["./src/types"] ./src/types/global.d.ts en el directorio especificadodeclare global {} y asegúrate de export {} si aún no exportas nada.