Propiedades de la clase privada de TypeScript

TypeScript admite propiedades privadas para clases

Control de acceso en clases de TypeScript

Muchos lenguajes de programación definen las propiedades de sus clases como privadas de forma predeterminada. Para que sean accesibles desde fuera de la instancia, normalmente debe marcar las propiedades relevantes con la palabra clave "público".

La misma palabra clave también está disponible en las clases de TypeScript, pero no tiene mucho impacto, ya que las propiedades en las clases de Typecript son públicas de forma predeterminada. Esta restricción se hereda de Javascript, que no admite propiedades privadas en clases. Bueno, hasta hace poco.

¿Campos privados en Javascript?

Si y no. Actualmente, un borrador de trabajo para una especificación que define propiedades privadas en clases de Javascript se encuentra en la etapa 3, lo que indica que una definición final es plausible, pero aún no está segura.

Los cambios propuestos en la especificación son realmente simples y solo modifican ligeramente la sintaxis. Para marcar una propiedad como privada, simplemente antepóngala con un hashtag. ¡Eso es!

class User {
  // A prop marked as private.
  #id;
  age;
  
  constructor(age){
    this.age = age;
    // Valid assignment, as we're 
    // within the class.
    this.#id = Math.floor(Math.random() * 1000);
  }
}

// ... Later in the code ...

const user = new User(42);
// Error! Won't work as it's private.
user.#id = 123;

¡Campos privados en TypeScript!

La misma sintaxis se aplica a las propiedades privadas en Typecript. Desde la versión 3.8, puede utilizar esta función para controlar mejor el acceso a las propiedades y funciones de las instancias y de los campos estáticos. La sintaxis es la misma que en el ejemplo de Javascript.

Un momento por favor, ¿campos estáticos privados?

Sí, leíste bien: las variables estáticas y las funciones también pueden ser privadas, lo que significa que solo se pueden llamar dentro de los miembros de la clase. Esta característica se agregó con la versión 4.3 de Typescript, junto con más cambios bajo el capó. Según la documentación de la versión 4.3, los miembros de la clase privada ahora son realmente privados en tiempo de ejecución, lo que indica que esta característica ha madurado por completo.

Tenga en cuenta que Typescript admite dos variantes diferentes de "privado" para las clases. El comúnmente conocido es con la palabra clave "privado", que mantiene inaccesibles los campos marcados incluso desde clases derivadas.

La otra característica, que es la que estoy mostrando aquí y que es nueva, es el uso de los llamados "nombres privados". Tienen la misma sintaxis que para Javascript, ya que su especificación fue definida originalmente por JS. En TypeScript, controlan el acceso durante el tiempo de ejecución.

/**
 * A class that uses already known
 * private props.
 */
class CommonUser {
  // Common 'private' prop in TS.
  private id: number;
  age: number;
  
  constructor(age: number){
    this.age = age;
    this.id = Math.floor(Math.random() * 1000);
  }
}

/**
 * Using the new sytanx for private class names.
 */
class SpecialUser {
  #id: number;
  age: number;
  
  constructor(age: number){
    this.age = age;
    // Valid, we're inside the class.
    this.#id = SpecialUser.#generateId();
  }
  
  static #generateId(){
    return Math.floor(Math.random() * 1000);
  }
  
  #stringifyId(){
    return this.#id.toString();
  }
}

// ... Later in the code ...

// Invalid, call is outside of class 'SpecialUser'.
SpecialUser.#generateId();

const user = new SpecialUser(42);
// And that won't work as well.
user.#stringifyId();

Últimas palabras del último capítulo

Este artículo no es muy extenso, pero destaca una gran función que ofrece Typecript ahora, así como un beneficio más general del propio Typecript. Para Javascript, las propiedades privadas todavía son un borrador (aunque en una etapa muy avanzada), pero para Typecript ya están implementadas y enviadas, lo que muestra la velocidad a la que está evolucionando este lenguaje.

Sugerencias

Relacionados

Adenda

Idiomas