Kan jag importera och exportera klass och namnrymd med samma namn samtidigt i TypeScript?


Considerera klassen (t.ex., ExampleUtil) i filen ExampleUtil.ts. För närvarande lagras de typer som ExampleUtil använder i filen ExampleUtil__TYPES.ts. Inga problem när man importerar dem till ExampleUtil.ts; för närvarande finns det inget behov av ett namespace.

När jag börjar använda ExampleUtil i andra projekt visade det sig att typer från ExampleUtil__TYPES.ts är kontextberoende och det är bättre att kapsla in dem i ett namespace. Dock används namnet ExampleUtil redan av en klass, så jag behöver välja ett annat namn för namespace eller lösa denna konflikt på annat sätt.

I mitt bibliotek organiserade jag typdefinitionerna som:

import ExampleUtil from "./ExampleUtil/ExampleUtil";
import { Type1, Type2 } from "./ExampleUtil/ExampleUtil__TYPES"
import OtherUtil from "./OtherUtil/OtherUtil";
import { Type3, Type4 } from "./OtherUtil/OtherUtil__TYPES"
// other classes, types and functions from library


/** Re-export for other project.
 *  Unlike "lodash", where each function is in separate file, herewith 
 *  all files are in same directory, here the developers can organize source files
 *  by directories, but users does not need to know these directories, because 
 *  they can get everything what they need from single "my-lib.js" file like below:
 *  import { ExampleUtil, Type1, Type2 } from "my-lib";
 *  All "my-lib" classes and functions those has not been used, will not be included
 *  by Webpack to production bundle.
 */
export {
  ExampleUtil, Type1, Type2,
  OtherUtil, Type3, Type4,
  // ... other classes, types and functions from library
};

Om vi kapslar in Type1 och Type2 i inget namnrymd ExampleUtil, kommer konflikten att uppstå redan här, i my-lib.d.ts: vi importerar klass och namnrymd med samma namn, sedan behöver vi exportera båda igen.

Så, kan jag skriva koden som

//                               👇 Namespace
const parameterForExampleUtil: ExampleUtil.Type1 = { /* ... */ };
//            👇 Namespace        👇 Class
const result: ExampleUtil.Type2 = ExampleUtil.getSomething(parameterForExampleUtil);

och om inte, vilket namn kan jag välja för namespace? Några goda praxis från andra programmeringsspråk tillåter att undvika konflikter mellan klassnamn och respektive namespace? Jag vet att att använda prefix I för gränssnitt är praxis, är det liknande för namespaces?

Relaterade artiklar