Аксессоры

Аксесоры или геттеры и сеттеры, или привычнее — свойства, незаменимая часть языка JavaScript, без которой сложно представить современную разработку. Но начинающим TypeScript разработчикам могут быть не совсем очевидны некоторые моменты, каждый из которых будет подробно рассмотрен в этой главе.

Отдельные типы аксеcсоров

На практике, могут возникнуть случаи, когда сеттер нуждается в установке значения, тип которого отличен от типа возвращаемого геттером. И TypeScript позволяет реализовать это.

ts
/**
 * Геттер возвращает тип number, в то время, как
 * сеттер ожидает значение принадлежащие к типу объединению
 * number | string | boolean
 */
class T0 {
    private _value = 0;

    get value(): number { 
        return this._value;
    }
    set value(value: number | string | boolean){
    }
}

Но есть один не очевидный момент заключающийся в том, что определение типа значения сеттера обязанно включать тип, который возвращает геттер. В противном случае возникнет ошибка.

js
class T {
    private _value = 0;

    /**
     * [*] Error -> The return type of a 'get' accessor must be assignable to its 'set' accessor typets(2380)
     */
    get value(): number { // [*]
        return this._value;
    }

    /**
     * Сеттер не включает тип возвращаемый геттером.
     */
    set value(value: string | boolean){
    }
}

И поскольку аксессоры могут быть объявлены и в объекте созданного при помощи литерала объекта ({}), стоит также упомянуть, что правила для них ничем не отличаются от правил для классов.