Búsqueda de sitios web

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:

  1. 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.

  2. 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.

  3. 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).

  4. Específicamente con respecto a su ejemplo: Su función independiente shout es privada para el módulo en el que aparece; el método estático en Foo es accesible desde otros módulos que importen Foo.

Un poco más cerca de la tierra de las opiniones:

  1. 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 import proporciona 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.

Artículos relacionados