microsoft / microsoft/TypeScript
Suggestion: Allow ES6 export syntax in namespaces
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
TypeScript Version: typescript@4.0.0-dev.20200801
Search Terms: namespace, import, export, re-export, module
Code
import { Point } from "./Point";
export type Line = {
readonly p1: Point;
readonly p2: Point;
readonly points?: readonly [Point, ...(readonly Point[])];
};
export namespace Line {
export { Point } from "~/Point"; // TS says "Export declarations are not permitted in a namespace"
// `export { Point };` <-- Should also work.
}
type LinePoint = Line.Point;
// ^ Somehow this actually works, i.e. `LinePoint` equals `Point`
Expected behavior:
Exporting from a namespace should mirror ES6 module exports, i.e. export { X }, export { X } from "...", and export * as NS from "..."
The lack of syntax for re-exports makes it very hard to use namespace/type/function merging abilities to represent nice APIs. Here's an example of what a module could look like if this was allowed...
// User.tsx
import { Admin } from "./Admin";
import { Member } from "./Member";
export type User = Admin | Member;
export type Props = { readonly user: User; };
export function User({ user }: Props) {
return Admin.isAdmin(user) ? <Admin admin={user} /> : <Member member={user} />;
}
export namespace User {
export { Admin, Member }; // Nice.
export const isAuthenticated = (user: User): boolean => true;
}
// Home.tsx
import { User } from "./User";
export function Home({ user }: User.Props) {
return <User.Admin admin={useAdmin()} />; // An example of what this enables.
}
Actual behavior:
TypeScript says "Export declarations are not permitted in a namespace," even though it actually respects the export declaration outside of the namespace.
Playground Link:
https://www.typescriptlang.org/play/#code/HYQwtgpgzgDiDGEAEBBJBvAUEnSIA8YB7AJwBcl4jgoKQkBeJAIhGaRCkutoG5MAvpkyhIsBMgBCGbLgLFyGVEgH8hmKjQr5GSSQDoU+kLyA
Related Issues:
https://github.com/microsoft/TypeScript/issues/20273
This issue showcases some of the syntax gymnastics needed to get around this issue.
https://github.com/microsoft/TypeScript/issues/4529
https://github.com/microsoft/TypeScript/issues/4529#issuecomment-140932811
More examples of verbose workarounds.
https://github.com/microsoft/TypeScript/issues/38041#issuecomment-616807133
@rbuckton Provides a nice example of what this could look like if enabled.
https://github.com/microsoft/TypeScript/issues/38041#issuecomment-662142857
My comment with another motivating example after the issue was closed.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, das verlinkte Playground-Beispiel und die zugehörigen Issues 20273, 4529 und 38041 zu prüfen, um die vorgeschlagenen Formen von Namespace-Exports und bestehende Workarounds zu verstehen. Als erledigt gilt die Unterstützung von export { X }, export { X } from "..." und export * as NS from "..." innerhalb von Namespaces ohne die aktuelle Diagnose.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 30/100