Búsqueda de sitios web

Restricciones aritméticas de miembros hash en Typescript


¿Puedo definir de alguna manera un tipo en TypeScript que también aplique restricciones aritméticas a las propiedades de un objeto, por ejemplo?

type RestrictedObject = {
a: number,
b: number,
}

para que a % b=0

Respuesta #1

No, eso requeriría comprobación en tiempo de ejecución, lo cual está fuera del alcance de TypeScript.

Puedes definir un objeto con propiedades de acceso para hacer cumplir la relación:

class Restricted {
    #a: number;
    #b: number;

    static #valid(a: number, b: number): boolean {
        return a % b === 0;
    }

    constructor(a: number,  b:number) {
        if (Restricted.#valid(a, b)) {
            throw new Error(`The values of 'a' and 'b' must be such that 'a % b' is 0; ${a} and ${b} don't fit`);
        }
        this.#a = a;
        this.#b = b;
    }

    get a() {
        return this.#a;
    }
    set a(value) {
        if (this.#b !== null) {
            if (Restricted.#valid(value, this.#b)) {
                throw new Error(`The value of 'a' cannot be ${value} when 'b' is ${this.#b}`);
            }
        }
        this.#a = value;
    }

    get b() {
        return this.#b;
    }
    set b(value) {
        if (this.#a !== null) {
            if (Restricted.#valid(this.#a, value)) {
                throw new Error(`The value of 'b' cannot be ${value} when 'a' is ${this.#a}`);
            }
        }
        this.#b = value;
    }
}

Nota al margen: Lo anterior utiliza campos privados nativos y métodos estáticos privados de JavaScript, que ahora son partes especificadas del lenguaje, pero podrías usar private de TypeScript en su lugar si quisieras.