[Typescript] Private field presents check

JS private field #serialNumbercannot 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 #fieldsand #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 otherCarevaluates to true, otherCar must be an instance ofCar. This is why we see the type of otherCar change from anyto 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
}

 

posted @ 2024-01-16 16:45  Zhentiw  阅读(7)  评论(0编辑  收藏  举报