Primitivos
Los primitivos son los tipos de datos básicos que se pueden utilizar en el lenguaje javascript. Estos son:
string
, number
, boolean
, null
, undefined
, symbol
y bigint
.
Cada uno de estos tipos de datos tiene sus propias características y métodos; pero el sdk y sus modulos y paquetes también tienen sus propios métodos y características que se pueden utilizar para manipular estos tipos de datos. Sera comun que encuentre objetos que representan datos del sistema y que encapsulan estos tipos de datos, por ejemplo, el objeto EthereumAddress
encapsula un tipo de dato string
que representa una dirección de ethereum y tiene métodos para manipular o validar esta dirección.
EthereumAddress
es un ejemplo de un objeto de valor, estos objetos encapsulan un tipo de dato primitivo y tienen métodos para manipular o validar este tipo de dato. Puedes ver más información sobre objetos de valor en la sección Objetos de valor.
Serializacion y deserializacion de clase con primitivos
Sabiendo esto el sdk tiene un tipo generico para extraer el tipo de dato primitivo de un objeto de valor en una clase. Este tipo es Primitives<T>
y se puede utilizar de la siguiente manera.
Supongamos que creamos una clase que tiene una propiedad address
que es de tipo EthereumAddress
y otra propiedad chainId
que es de tipo ChainId
:
class MyClass {
constructor(
public address: EthereumAddress,
public chainId: ChainId
) {}
}
Ahora queremos extraer en un nuevo tipo de dato los primitivos de la clase MyClass
, para esto podemos utilizar el tipo Primitives<T>
de la siguiente manera:
type MyClassPrimitives = Primitives<MyClass>;
Esto nos creara un nuevo tipo de dato que es la representación de los primitivos de la clase MyClass
:
type MyClassPrimitives = {
address: string; // address ahora es de tipo string y no de tipo EthereumAddress
chainId: number; // chainId ahora es de tipo number y no de tipo ChainId
}
Ahora podemos hacer que la clase MyClass
pueda construirse a partir de los primitivos y tambien que devuelva sus primitivos de la siguiente manera:
class MyClass {
constructor(
public address: EthereumAddress,
public chainId: ChainId
) {}
static from(primitives: MyClassPrimitives): MyClass {
return new MyClass(
new EthereumAddress(primitives.address),
new ChainId(primitives.chainId)
);
}
toPrimitives(): MyClassPrimitives {
return {
address: this.address.value,
chainId: this.chainId.value
}
}
}
const myClass = MyClass.from({
address: '0xa73a3b8ACa335855EeaC2f9Fb505BB0360A1B703',
chainId: 80001
});
Ahora la clase MyClass
puede construirse a partir de los primitivos de la clase y también se puede serializar utilizando los primitivos de la clase.
const myClassPrimitives = myClass.toPrimitives();
La construccion de todos los objetos de valor o subclases internas quedan encapsulados y solo los conoce la clase MyClass
. Mientras que la clase puede ser serializada y deserializada utilizando los primitivos de la clase.
Propiedades privadas de una clase
Las propiedades privadas de una clase no se pueden extraer de una clase y por lo tanto no se pueden serializar utilizando los primitivos de la clase.
class MyPrivateClass {
private owner: EthereumAddress;
constructor(
public address: EthereumAddress,
public chainId: ChainId
) {}
}
type MyPrivateClassPrimitives = Primitives<MyPrivateClass>;
// MyPrivateClassPrimitives es igual a:
type MyPrivateClassPrimitives = {
address: string;
chainId: number;
}
En el ejemplo anterior la propiedad owner
es privada y no se puede extraer de la clase MyPrivateClass
y por lo tanto no se puede serializar utilizando los primitivos de la clase.
Propiedades de solo lectura de una clase
En el caso de las propiedades de solo lectura de una clase, estas se pueden extraer de la clase y por lo tanto se pueden serializar utilizando los primitivos de la clase pero no podran ser modificadas ya que se crearan como propiedades de solo lectura en los primitivos de la clase.
class MyReadOnlyClass {
constructor(
readonly address: EthereumAddress,
readonly chainId: ChainId
) {}
}
type MyReadOnlyClassPrimitives = Primitives<MyReadOnlyClass>;
// MyReadOnlyClassPrimitives es igual a:
type MyReadOnlyClassPrimitives = {
readonly address: string;
readonly chainId: number;
}
Primitivos de subclases
Si una clase ademas de tener propiedades con objetos de valor tambien tiene propiedades con clases complejas o jerarquias de clases, el tipo Primitives<T>
recorrera tambien estas y extraera los primitivos de estas clases.
class MySubClass {
constructor(
public address: EthereumAddress,
public chainId: ChainId
) {}
}
class MyClass {
constructor(
readonly owner: Owner,
public subClass: MySubClass
) {}
}
type MyClassPrimitives = Primitives<MyClass>;
// MyClassPrimitives es igual a:
type MyClassPrimitives = {
readonly owner: string;
subClass: {
address: string;
chainId: number;
}
}
Esperamos que esta sección te haya ayudado a entender como se pueden serializar y deserializar clases utilizando los primitivos de estas y que puedas ver que el sdk esta diseñado para que puedas serializar y deserializar objetos de valor y clases de una manera sencilla.