Usar espacios de nombres en TypeScript, pero solo para tipos => ¿anti-patrón?
De vez en cuando, la gente te dice que no deberías usar espacios de nombres en TypeScript. Por ejemplo aquí: https://typescript-eslint.io/rules/no-namespace/ (error de eslint: "Se prefiere la sintaxis de módulos ES2015 sobre los espacios de nombres")
Por supuesto que sé lo que es un módulo ES y, por supuesto, mi código TS está esencialmente estructurado en módulos ES.
No obstante, en ciertos casos (componentes de la interfaz de usuario, eventos complejos, etc.) utilizo espacios de nombres para agrupar tipos (¡solo tipos!), para facilitar la importación y el uso de esos tipos más adelante. Vea el siguiente ejemplo (este es un tipo de componente de UI). Lo importante es que más adelante, al usar import { Button } from 'xyz', se tiene acceso a la función Button en sí y a todos los tipos Button.Type, Button.Variant y Button.Size, los cuales considero extremadamente útiles.
export { Button };
namespace Button {
export type Type = 'button' | 'submit' | 'reset';
export type Variant = 'default' | 'primary' | 'warning' | 'danger';
export type Size = 'small' | 'medium' | 'large';
}
function Button(props: {
type?: Button.Type;
variant?: Button.Variant;
size?: Button.Size;
// ... and others ...
}) {
// not important
}
[Editar: Por favor, considere este ejemplo como parte de una biblioteca de widgets, no de una aplicación]
¿Consideras esto un anti-patrón? Por favor, explica tu respuesta.
Respuesta #1
Como dijiste, Namespace se considera obsoleto. Es mejor evitarlo. En su lugar, haz algo como:
botón.ts
export type Type = 'button' | 'submit' | 'reset';
export type Variant = 'default' | 'primary' | 'warning' | 'danger';
export type Size = 'small' | 'medium' | 'large';
app.ts
import * as Button from './button'
function createButton(props: {
type?: Button.Type;
variant?: Button.Variant;
size?: Button.Size;
}) {
// do something here
}
En cuanto a por qué está desactualizado o no se recomienda, bueno, por un lado, puede causar conflictos y superposición no intencional de dos espacios de nombres. El patrón anterior te pone al mando cuando lo importas.
