Corregir importaciones automáticas incorrectas en un monorepo de TypeScript
Tengo un repositorio mono de TypeScript con la siguiente estructura básica de archivos:
├── packages/
│ ├── workspace-a/
│ │ ├── src/
│ │ └── tsconfig.json
│ └── workspace-b/
│ ├── src/
│ └── tsconfig.json
└── tsconfig.json
El archivo raíz tsconfig.json se ve así (con propiedades irrelevantes eliminadas):
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@scope/*": ["packages/*/src"]
},
"module": "es2020",
"moduleResolution": "node"
}
}
tsconfig.json para cada paquete se ve así:
{
"extends": "../../tsconfig"
}
Todos los paquetes usan el ámbito @scope. Esta configuración hace que el siguiente código funcione desde workspace-a, como se esperaba:
import { Foo } from '@scope/workspace-b';
Sin embargo, el siguiente código también funciona según tsc y es sugerido primero por las importaciones automáticas en VSCode:
import { Foo } from '@scope/workspace-b/src';
import { Bar } from 'packages/workspace-b/src';
Lo último no funciona una vez que los paquetes se publican en npm, causando problemas después de que los paquetes hayan sido publicados.
¿Puedo hacer que TypeScript no permita lo último? También aceptaré una solución que implique una regla existente de ESLint.
El código fuente completo se puede encontrar aquí.
Respuesta #1
Este problema es causado por la opción baseUrl. Esto era necesario anteriormente al usar la opción paths.
A partir de TypeScript 4.1, paths se pueden usar sin baseUrl.
Entonces el tsconfig.json se vería así:
{
"compilerOptions": {
"paths": {
"@scope/*": ["./packages/*/src"]
},
"module": "es2020",
"moduleResolution": "node"
}
}
Omitir el baseUrl aún no es compatible con tsconfig-paths, que también es utilizado por varios paquetes populares relacionados con TypeScript, tales como:
eslint-import-resolver-typescripteslint-plugin-importtsconfig-paths-webpack-plugin
Tenga en cuenta que si utiliza tsconfig-paths para que "paths" funcione con ts-node, debe especificar explícitamente "baseUrl" con él porque aún no admite baseUrl no especificado.
