ข้อจำกัดเชิงคณิตศาสตร์ของสมาชิกแฮชใน 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 แทนได้ถ้าคุณต้องการ
