es6-moduler - redusere redundans i TypeScript-eksport
Hver av TypeScript-filene i en models-katalog eksporterer en hovedtype og en samling metoder som er relatert til den.
export type User = { ... }
export function addToTeam() { ... }
Jeg eksporterer alle disse filene på nytt gjennom en index.ts i roten av katalogen.
import * as User from "./User";
import * as Team from "./Team";
export { User, Team };
Dette legger til noe redundans når man refererer til hovedtypen rundt resten av kodebasen.
import { User, Team } from "./models";
function join(user: User.User, team: Team.Team) {
return User.addToTeam(user.id, team.id);
}
Siden typer og verdier ikke lever i samme omfang, er det mulig å eksportere begge under samme navn.
// models/index.ts
import * as _User from "./User";
import * as _Team from "./Team";
export const User = _User;
export type User = _User.User;
export const Team = _Team;
export type Team = _Team.Team;
Noe som betyr at den importerte identifikatoren kan referere til begge.
import { User, Team } from "./models";
function join(user: User, team: Team) {
return Foo.createFoo(foo);
}
Er det noen måte å eksportere begge under samme navn uten å opprette en ny type og en ny variabel i prosessen?
Her er noen eksempler på mislykkede forsøk.
// TypeScript doesn't support "export * as"
export * as User from "./User";
export { User } from "./User";
// Duplicate exports
import * as User from "./User";
export type User = User.User;
export { User };
// Duplicate exports
import * as User from "./User";
import { User as UserType } from "./User";
export { User, UserType as User }
// Duplicate exports
import * as User from "./User";
export { User } from "./User";
export { User };
Hovedproblemet med alt ovenfor er at export { ... }-formen ser ut til å eksportere både i type- og verdihierarkier.
Her er noen andre løsninger som jeg ikke er interessert i:
- Innpakking av funksjonene i et navnerom med samme navn som typen
- Endre eksportert navn på typen
- Bruke en typet klasse med statiske metoder
Svar #1
I index.ts bør du kunne bare eksportere fra modulen... ingen behov for å importere den først.
import * as User from "./User";
import * as Team from "./Team";
export { User, Team };
Endre til:
export * from "./User";
export * from "./Team";
Da vil du kunne fjerne disse overflødige navnene:
import { User, Team } from "./models";
function join(user: User, team: Team) {
return addToTeam(user.id, team.id);
}
