Typescript-hash-jäsenen aritmeettiset rajoitukset
Voinko määritellä jollain tavalla tyypin TypeScriptissä, joka soveltaa myös aritmeettisia rajoitteita objektin ominaisuuksiin, esim.
type RestrictedObject = {
a: number,
b: number,
}
jotta a % b=0
Vastaus #1
Ei, se vaatisi ajonaikaista tarkistusta, mikä on TypeScriptin rajojen ulkopuolella.
Voit määritellä objektin accessor-ominaisuuksilla pakottaaksesi suhteen:
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;
}
}
Sivuhuomautus: Yllä käytetään JavaScriptin natiiveja yksityisiä kenttiä ja yksityisiä staattisia metodeja, jotka ovat nyt kielellisiä määriteltyjä osia, mutta voit käyttää sen sijaan TypeScriptin private-avainsanaa, jos haluat.
