[Typescript] Private field presents check
JS private field #serialNumber
cannot be accessed outside class. But within class, it is accessible.
JS private field can also be used to check class instance equality.
class Car {
#serialNumber = Math.floor(Math.random() * 100)
// check the given instance is the current one
equals(otherCar: any) {
if (otherCar && typeof otherCar === 'object' && #serialNumber in otherCar) {
// otherCar // Car type
// #serialNumber is accessable inside Car class
// but it is not accessable outside Car class, for example
// const c1 = new Car()
// c1.#serailNumber // Error: private filed is not accessible outside class
return this.#serialNumber === otherCar.#serialNumber
}
return false
}
}
const c1 = new Car()
const c2 = c1
console.log(c1.equals(c2)) // true
const c3 = new Car()
console.log(c3.equals(c1)) // false
Using #serialNumber in otherCar
, we can check to make sure the given instance is actually the same instance we are checking against.
Part of understanding what’s happening here is remembering the rules about JS private #fields
and #methods
. It may be true that another class has a private #serialNumber
field, but instances of Car
would not be able to read it. Thus, if #serialNumber in otherCar
evaluates to true
, otherCar
must be an instance ofCar
. This is why we see the type of otherCar
change from any
to Car
after this check is performed.
You can also use private filed present check to check whether the instance is come out from constructor.
class Car {
#serialNumber = Math.floor(Math.random() * 100)
static isCar(car: any) {
if (car && typeof car === 'object' && #serialNumber in car) {
return true
}
return false
}
}
// Usage
if (Car.isCar(val)) {
val //Car type
}