ค้นหาเว็บไซต์

ข้อจำกัดเชิงคณิตศาสตร์ของสมาชิกแฮชใน Typescript


ฉันสามารถกำหนดชนิดใน TypeScript ที่ใช้ข้อจำกัดทางคณิตศาสตร์กับคุณสมบัติของอ็อบเจ็กต์ได้อย่างไร เช่น

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

เพื่อให้ a % b=0

คำตอบ #1

ไม่ นั่นจะต้องมีการตรวจสอบขณะรันไทม์ ซึ่งอยู่นอกขอบเขตของ TypeScript

คุณสามารถกำหนดอ็อบเจ็กต์ด้วยคุณสมบัติการเข้าถึงเพื่อบังคับใช้ความสัมพันธ์ได้:

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;
    }
}

หมายเหตุ: ข้างต้นใช้ฟิลด์ส่วนตัวและเมธอดสถิติส่วนตัวของ JavaScript ซึ่งเป็นส่วนที่กำหนดของภาษาตอนนี้ แต่คุณสามารถใช้ private ของ TypeScript แทนได้ถ้าคุณต้องการ