TypeScript: método estático vs función definida fuera de la clase
¿Cuáles son las diferencias prácticas entre un método de clase estático y una función definida fuera de una clase (en la parte superior del archivo) en TypeScript?
Sé que hay diferencias con respecto a la visibilidad desde otras clases y archivos. Sin embargo, cuando la visibilidad no es un problema (la función/método solo se usa en una clase), ¿cuándo deberíamos usar métodos estáticos en lugar de funciones definidas fuera de cualquier clase?
Ejemplo :
export class Foo {
constructor(bar: string) {
Foo.shout(bar);
}
private static shout(content: string) {
console.log(string.toUpperCase());
}
}
VS
export class Foo {
constructor(bar: string) {
shout(bar);
}
}
function shout(content: string) {
console.log(string.toUpperCase());
}
Respuesta #1
¿Cuáles son las diferencias prácticas entre un método de clase estático y una función definida fuera de una clase (en la parte superior del archivo) en TypeScript?
No tantos:
El código que usa el método estático debe tener acceso a la clase; el código que usa una función independiente debe tener acceso a la función independiente en su lugar.
Usar el método estático técnicamente implica una búsqueda de propiedad en la función constructora de la clase; usar una función independiente no lo hace. En la práctica, esto se optimizará de manera que no importe.
El código en el método estático tendrá acceso a la función constructora del constructor padre a través de
super(algo que es bastante único de JavaScript); el código en una función independiente no lo tiene (porque no hay constructor padre).Específicamente con respecto a su ejemplo: Su función independiente
shoutes privada para el módulo en el que aparece; el método estático enFooes accesible desde otros módulos que importenFoo.
Un poco más cerca de la tierra de las opiniones:
- Una función independiente es independiente, no proporciona mucho contexto sobre lo que es o dónde está definida para alguien que lee el código. Un método estático proporciona más contexto, mediante el nombre de la clase. Pero, si estás usando módulos (como parece ser tu caso), el
importproporciona algo de contexto para la función independiente.
...cuándo deberíamos usar métodos estáticos en lugar de funciones definidas fuera de cualquier clase.
Eso es en gran medida una cuestión de opinión y estilo, por lo que está fuera de tema para Stack Overflow. Si tu equipo siente la necesidad de consistencia usando algún conjunto de reglas, acuerden un conjunto y sean consistentes.