microsoft / microsoft/TypeScript
Suggestion: Allow ES6 export syntax in namespaces
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
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.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par examiner l’exemple Playground lié ainsi que les issues associées 20273, 4529 et 38041 afin de comprendre les formes d’export de namespace proposées et les workarounds existants. La tâche serait considérée comme terminée si export { X }, export { X } from "..." et export * as NS from "..." sont pris en charge dans les namespaces sans le diagnostic actuel.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 30/100