typescript - Förhindra importer utanför modulen utom genom index
Finns det en enkel lösning (kanske en lint-regel?) som kan hjälpa till att säkerställa rena kodimporter genom indexfiler? Jag skulle vilja förhindra att man importerar kod från "kusin"-filer, förutom om den görs tillgänglig via en indexfil.
Ex :
- app
+ dogs
| + index.ts
| + breeds
| | + retriever.ts
| | + schnauzer.ts
| + activities
| + playing.ts
| + walking.ts
+ cats
+ index.ts
+ breeds
| + siamese.ts
| + persion.ts
+ activities
+ sleeping.ts
+ hunting.ts
Importering från perspektivet av cats/activities/hunting.ts:
import { sleeping } from './sleeping' // VALID - inside same folder
import { siamese } from '../breeds/siamese' // VALID - inside cats module
import { playing } from '../../dogs' // VALID - importing from an index
import { retriever} from '../../dogs/activities/breeds' // INVALID - cousin file outside module possibly not exported from index
Svar #1
Du kan använda eslints import/no-internal-modules-regel och konfigurera separata .eslintrc-regler per "root"-modul.
I din dogs-mapp, skapa en ny .eslintrc-fil med detta innehåll:
{
"rules": {
"import/no-internal-modules": [ "error", {
"allow": [ "app/dogs/**", "app/*" ],
} ]
}
}
Detta betyder att vilken js/ts-fil som helst i dogs-mappen (eller någon undermapp till dogs) kan importera filer från sitt eget paket ELLER vilket paket som helst som /cats
Gör samma sak för dina cats och alla andra "root"-moduler.
Svar #2
Regeln no-restricted-imports i eslint kan användas för att tillhandahålla anpassade regler för importmönster. Detta mönster förhindrar allt 2+ nivåer upp och sedan 2+ nivåer ner, vilket förhindrar kusinimporter.
"no-restricted-imports": [
"warn",
{
"patterns": [
{
"group": ["**/../../[a-zA-Z]*/[a-zA-Z]*/**"],
"message": "File not exposed from the module. Consider exporting it from an index"
}
]
}
]
