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);
}

Relaterte artikler