Verbrauchsausweis Klasse
This commit is contained in:
@@ -12,11 +12,10 @@
|
|||||||
import AusweisPreviewContainer from "~/components/Ausweis/AusweisPreviewContainer.svelte";
|
import AusweisPreviewContainer from "~/components/Ausweis/AusweisPreviewContainer.svelte";
|
||||||
import { calculateEnergyPerformanceScore } from "./energyPerformanceCalculation";
|
import { calculateEnergyPerformanceScore } from "./energyPerformanceCalculation";
|
||||||
import ZipSearch from "../ZIPSearch.svelte";
|
import ZipSearch from "../ZIPSearch.svelte";
|
||||||
|
import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis";
|
||||||
|
|
||||||
|
const ausweis = new Verbrauchsausweis();
|
||||||
|
|
||||||
let additionalHeating: boolean = false;
|
|
||||||
let heatedWaterIncluded: boolean = false;
|
|
||||||
let heatedWaterPortion: number = 18;
|
|
||||||
let hasCellar: boolean = false;
|
|
||||||
let conversionFactor: number = 0;
|
let conversionFactor: number = 0;
|
||||||
let calorificValueFactor: number = 0;
|
let calorificValueFactor: number = 0;
|
||||||
|
|
||||||
@@ -26,55 +25,42 @@
|
|||||||
|
|
||||||
let area = 0;
|
let area = 0;
|
||||||
let energyPerformance = 0;
|
let energyPerformance = 0;
|
||||||
let zip: string = "";
|
|
||||||
let city: string = "";
|
|
||||||
|
|
||||||
$: {
|
$: {
|
||||||
energyPerformance = calculateEnergyPerformanceScore(
|
energyPerformance = calculateEnergyPerformanceScore(
|
||||||
energyConsumption,
|
energyConsumption,
|
||||||
additionalEnergyConsumption,
|
additionalEnergyConsumption,
|
||||||
heatedWaterPortion,
|
ausweis.anteil_warmwasser_1,
|
||||||
climateFactors,
|
climateFactors,
|
||||||
area * (hasCellar ? 1.35 : 1.2),
|
area * (ausweis.keller_beheizt ? 1.35 : 1.2),
|
||||||
conversionFactor,
|
conversionFactor,
|
||||||
calorificValueFactor
|
calorificValueFactor
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let baujahrGebaeude: number;
|
|
||||||
let baujahrHeizungsAnlage: number;
|
|
||||||
let apartmentCount: number;
|
|
||||||
let certificateReason:
|
|
||||||
| "Vermietung"
|
|
||||||
| "Neubau"
|
|
||||||
| "Verkauf"
|
|
||||||
| "Modernisierung"
|
|
||||||
| "Sonstiges";
|
|
||||||
let sanitationStatus: boolean;
|
|
||||||
|
|
||||||
let needsRequirementCertificate: boolean = false;
|
let needsRequirementCertificate: boolean = false;
|
||||||
|
|
||||||
$: needsRequirementCertificate =
|
$: needsRequirementCertificate =
|
||||||
(baujahrGebaeude < 1978 &&
|
(ausweis.baujahr_gebaeude < 1978 &&
|
||||||
apartmentCount <= 4 &&
|
ausweis.anzahl_einheiten <= 4 &&
|
||||||
sanitationStatus == false &&
|
ausweis.objekt_saniert == false &&
|
||||||
(certificateReason == "Vermietung" ||
|
(ausweis.ausstellgrund == "Vermietung" ||
|
||||||
certificateReason == "Sonstiges")) ||
|
ausweis.ausstellgrund == "Sonstiges")) ||
|
||||||
certificateReason == "Neubau" ||
|
ausweis.ausstellgrund == "Neubau" ||
|
||||||
certificateReason == "Modernisierung" ||
|
ausweis.ausstellgrund == "Modernisierung" ||
|
||||||
certificateReason == "Verkauf";
|
ausweis.ausstellgrund == "Verkauf";
|
||||||
|
|
||||||
function automatischAusfüllen() {
|
function automatischAusfüllen() {
|
||||||
baujahrGebaeude = 1962;
|
ausweis.baujahr_gebaeude = 1962;
|
||||||
baujahrHeizungsAnlage = 1974;
|
ausweis.baujahr_anlage = 1974;
|
||||||
sanitationStatus = true;
|
ausweis.objekt_saniert = true;
|
||||||
apartmentCount = 1;
|
ausweis.anzahl_einheiten = 1;
|
||||||
certificateReason = "Vermietung";
|
ausweis.ausstellgrund = "Vermietung";
|
||||||
energyConsumption = [15000, 14000, 16000]
|
energyConsumption = [15000, 14000, 16000]
|
||||||
area = 152;
|
area = 152;
|
||||||
hasCellar = true;
|
ausweis.keller_beheizt = true;
|
||||||
heatedWaterIncluded = true;
|
ausweis.warmwasser_enthalten = true;
|
||||||
heatedWaterPortion = 18;
|
ausweis.anteil_warmwasser_1 = 18;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -106,11 +92,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Ausweisart
|
<Ausweisart
|
||||||
bind:baujahrGebaeude
|
bind:baujahrGebaeude={ausweis.baujahr_gebaeude}
|
||||||
bind:apartmentCount
|
bind:apartmentCount={ausweis.anzahl_einheiten}
|
||||||
bind:certificateReason
|
bind:certificateReason={ausweis.ausstellgrund}
|
||||||
bind:sanitationStatus
|
bind:sanitationStatus={ausweis.objekt_saniert}
|
||||||
bind:baujahrHeizungsAnlage
|
bind:baujahrHeizungsAnlage={ausweis.baujahr_anlage}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -166,7 +152,7 @@
|
|||||||
|
|
||||||
<!-- PLZ -->
|
<!-- PLZ -->
|
||||||
<div class="form-group col-md-4 PLZ">
|
<div class="form-group col-md-4 PLZ">
|
||||||
<ZipSearch bind:zip bind:city name="zip" />
|
<ZipSearch bind:zip={ausweis.objekt_plz} bind:city={ausweis.objekt_ort} name="zip" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- IGort: readonly entfernt - Nelson -->
|
<!-- IGort: readonly entfernt - Nelson -->
|
||||||
@@ -179,7 +165,7 @@
|
|||||||
name="IGort"
|
name="IGort"
|
||||||
class="input-md buchstaben"
|
class="input-md buchstaben"
|
||||||
readonly={true}
|
readonly={true}
|
||||||
bind:value={city}
|
bind:value={ausweis.objekt_ort}
|
||||||
type="text"
|
type="text"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -210,7 +196,7 @@
|
|||||||
<div class="form-group col-md-4">
|
<div class="form-group col-md-4">
|
||||||
<Label>Keller *</Label>
|
<Label>Keller *</Label>
|
||||||
<div>
|
<div>
|
||||||
<select name="IGkeller" required bind:value={hasCellar}>
|
<select name="IGkeller" required bind:value={ausweis.keller_beheizt}>
|
||||||
<option>Bitte auswählen</option>
|
<option>Bitte auswählen</option>
|
||||||
<option value={false}>nicht vorhanden</option>
|
<option value={false}>nicht vorhanden</option>
|
||||||
<option value={false}>unbeheizt</option>
|
<option value={false}>unbeheizt</option>
|
||||||
@@ -241,7 +227,7 @@
|
|||||||
|
|
||||||
<div class="GRB">
|
<div class="GRB">
|
||||||
<Verbrauch
|
<Verbrauch
|
||||||
bind:additionalHeating
|
bind:additionalHeating={ausweis.zusaetzliche_heizquelle}
|
||||||
bind:energyConsumption
|
bind:energyConsumption
|
||||||
bind:additionalEnergyConsumption
|
bind:additionalEnergyConsumption
|
||||||
bind:climateFactors
|
bind:climateFactors
|
||||||
@@ -268,7 +254,7 @@
|
|||||||
type="checkbox"
|
type="checkbox"
|
||||||
class="IGwwbool"
|
class="IGwwbool"
|
||||||
name="IGwwbool"
|
name="IGwwbool"
|
||||||
bind:checked={heatedWaterIncluded}
|
bind:checked={ausweis.warmwasser_enthalten}
|
||||||
/>Warmwasser im Verbrauch enthalten</label
|
/>Warmwasser im Verbrauch enthalten</label
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
@@ -285,8 +271,8 @@
|
|||||||
name="IGwarmwasser"
|
name="IGwarmwasser"
|
||||||
maxlength="2"
|
maxlength="2"
|
||||||
type="text"
|
type="text"
|
||||||
bind:value={heatedWaterPortion}
|
bind:value={ausweis.anteil_warmwasser_1}
|
||||||
disabled={!heatedWaterIncluded}
|
disabled={!ausweis.warmwasser_enthalten}
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -302,7 +288,7 @@
|
|||||||
maxlength="3"
|
maxlength="3"
|
||||||
type="text"
|
type="text"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
disabled={!additionalHeating}
|
disabled={!ausweis.zusaetzliche_heizquelle}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
245
src/lib/Ausweis/Verbrauchsausweis.ts
Normal file
245
src/lib/Ausweis/Verbrauchsausweis.ts
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
import { getKlimafaktorenClient } from "../Klimafaktoren";
|
||||||
|
|
||||||
|
export enum AusweisType {
|
||||||
|
VERBRAUCHSAUSWEIS,
|
||||||
|
VERBRAUCHSAUSWEIS_NICHT_WOHNGEBAEUDE,
|
||||||
|
BEDARFSAUSWEIS,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum Lueftungskonzept {
|
||||||
|
"Fensterlüftung",
|
||||||
|
"Schachtlüftung",
|
||||||
|
"Lüftungsanlage ohne Wärmerückgewinnung",
|
||||||
|
"Lüftungsanlage mit Wärmerückgewinnung",
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Ausweisart = "VA" | "BA" | "VANW";
|
||||||
|
export type Ausstellgrund = "Vermietung" | "Neubau" | "Verkauf" | "Modernisierung" | "Sonstiges";
|
||||||
|
|
||||||
|
export class Verbrauchsausweis {
|
||||||
|
public ausweisart: Ausweisart = "VA";
|
||||||
|
public id: number = 0;
|
||||||
|
public user_id: number = 0;
|
||||||
|
public rechnung_adresse: number = 0;
|
||||||
|
public versand_adresse: number = 0;
|
||||||
|
public objekt_typ: string = "";
|
||||||
|
public objekt_plz: string = "";
|
||||||
|
public objekt_ort: string = "";
|
||||||
|
public objekt_strasse: string = "";
|
||||||
|
public objekt_gebaeudeteil: string = "";
|
||||||
|
public objekt_saniert: boolean = false;
|
||||||
|
public baujahr_gebaeude: number = 0;
|
||||||
|
public baujahr_anlage: number = 0;
|
||||||
|
public anzahl_einheiten: number = 0;
|
||||||
|
|
||||||
|
public erstellungsdatum: Date = new Date();
|
||||||
|
public ausstellgrund: Ausstellgrund = "Vermietung";
|
||||||
|
|
||||||
|
public energieverbrauch_zeitraum_monat: number = 0;
|
||||||
|
public energieverbrauch_zeitraum_jahr: number = 0;
|
||||||
|
public energieverbrauch_1_heizquelle_1: number = 0;
|
||||||
|
public energieverbrauch_2_heizquelle_1: number = 0;
|
||||||
|
public energieverbrauch_3_heizquelle_1: number = 0;
|
||||||
|
public energieverbrauch_1_heizquelle_2: number = 0;
|
||||||
|
public energieverbrauch_2_heizquelle_2: number = 0;
|
||||||
|
public energieverbrauch_3_heizquelle_2: number = 0;
|
||||||
|
|
||||||
|
public energietraeger_einheit_heizquelle_1: string = "";
|
||||||
|
public energietraeger_einheit_heizquelle_2: string = "";
|
||||||
|
public energietraeger_1: string = "";
|
||||||
|
public energietraeger_2: string = "";
|
||||||
|
|
||||||
|
public anteil_warmwasser_1: number = 0;
|
||||||
|
public anteil_warmwasser_2: number = 0;
|
||||||
|
|
||||||
|
public public_id: string = "";
|
||||||
|
|
||||||
|
public wohnflaeche: number = 0;
|
||||||
|
public keller_beheizt: boolean = false;
|
||||||
|
public dachgeschoss: string = "";
|
||||||
|
public zusaetzliche_heizquelle: boolean = false;
|
||||||
|
public warmwasser_enthalten: boolean = false;
|
||||||
|
public lueftungskonzept: Lueftungskonzept = Lueftungskonzept.Fensterlüftung;
|
||||||
|
public wird_gekuehlt: boolean = false;
|
||||||
|
public leerstand: number = 0;
|
||||||
|
public images: string[] = [];
|
||||||
|
|
||||||
|
public versorgungssysteme: number = 0;
|
||||||
|
public fenster_dach: number = 0;
|
||||||
|
public energiequelle_2_nutzung: number = 0;
|
||||||
|
public daemmung: number = 0;
|
||||||
|
public energetische_nutzfläche: number = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bedarfsausweis spezifische Eigenschaften
|
||||||
|
*/
|
||||||
|
public anzahl_vollgeschosse: number = 0;
|
||||||
|
public geschosshoehe: number = 0;
|
||||||
|
public anzahl_gauben: number = 0;
|
||||||
|
public breite_gauben: number = 0;
|
||||||
|
public masse_a: number = 0;
|
||||||
|
public masse_b: number = 0;
|
||||||
|
public masse_c: number = 0;
|
||||||
|
public masse_d: number = 0;
|
||||||
|
public masse_e: number = 0;
|
||||||
|
public masse_f: number = 0;
|
||||||
|
public fensterflaeche_so_sw: number = 0;
|
||||||
|
public fensterflaeche_nw_no: number = 0;
|
||||||
|
public aussenwandflaeche_unbeheizt: number = 0;
|
||||||
|
public dachflaeche: number = 0;
|
||||||
|
public dach_u_wert: number = 0;
|
||||||
|
public deckenflaeche: number = 0;
|
||||||
|
public decke_u_wert: number = 0;
|
||||||
|
public aussenwand_flaeche: number = 0;
|
||||||
|
public aussenwand_u_wert: number = 0;
|
||||||
|
public fussboden_flaeche: number = 0;
|
||||||
|
public fussboden_u_wert: number = 0;
|
||||||
|
public volumen: number = 0;
|
||||||
|
public dicht: boolean = false;
|
||||||
|
public fenster_flaeche_1: number = 0;
|
||||||
|
public fenster_art_1: string = "";
|
||||||
|
public fenster_flaeche_2: number = 0;
|
||||||
|
public fenster_art_2: string = "";
|
||||||
|
public dachfenster_flaeche: number = 0;
|
||||||
|
public dachfenster_art: string = "";
|
||||||
|
public haustuer_flaeche: number = 0;
|
||||||
|
public haustuer_art: string = "";
|
||||||
|
public dach_bauart: string = "";
|
||||||
|
public dach_daemmung: number = 0;
|
||||||
|
public decke_bauart: string = "";
|
||||||
|
public decke_daemmung: number = 0;
|
||||||
|
public aussenwand_bauart: string = "";
|
||||||
|
public aussenwand_daemmung: number = 0;
|
||||||
|
public boden_bauart: string = "";
|
||||||
|
public boden_daemmung: number = 0;
|
||||||
|
public warmwasser_verteilung: string = "";
|
||||||
|
public warmwasser_speicherung: string = "";
|
||||||
|
public warmwasser_erzeugung: string = "";
|
||||||
|
public heizung_zentral: boolean = false;
|
||||||
|
public heizung_verteilung: string = "";
|
||||||
|
public heizung_speicherung: string = "";
|
||||||
|
public waerme_erzeugung_heizung: string = "";
|
||||||
|
public anteil_zusatzheizung: number = 0;
|
||||||
|
public kollektor_flaeche: number = 0;
|
||||||
|
|
||||||
|
// VANW
|
||||||
|
|
||||||
|
public vanw_stromverbrauch_enthalten: number = 0;
|
||||||
|
public vanw_stromverbrauch_sonstige: string = "";
|
||||||
|
public vanw_strom_1: number = 0;
|
||||||
|
public vanw_strom_2: number = 0;
|
||||||
|
public vanw_strom_3: number = 0;
|
||||||
|
|
||||||
|
public regnummer: string = "";
|
||||||
|
public erledigt: boolean = false;
|
||||||
|
|
||||||
|
public anrede: string = "";
|
||||||
|
public name: string = "";
|
||||||
|
public vorname: string = "";
|
||||||
|
public email: string = "";
|
||||||
|
public telefonnummer: string = "";
|
||||||
|
|
||||||
|
public constructor() {}
|
||||||
|
|
||||||
|
public async endEnergieVerbrauch(): Promise<number> {
|
||||||
|
const date = Date.parse(
|
||||||
|
`${this.energieverbrauch_zeitraum_jahr}-${this.energieverbrauch_zeitraum_monat}-01 00:00:01`
|
||||||
|
);
|
||||||
|
const klimafaktoren = await getKlimafaktorenClient(
|
||||||
|
date,
|
||||||
|
this.objekt_plz
|
||||||
|
);
|
||||||
|
|
||||||
|
// Endenergieverbrauch
|
||||||
|
// Um den EEV auszurechnen, müssen die Verbräuche zu kWh konvertiert werden.
|
||||||
|
let [umrechnungsfaktor, primaerfaktor, heizwertfaktor, coe] = [
|
||||||
|
1, 1, 1, 1,
|
||||||
|
];
|
||||||
|
let [umrechnungsfaktor_1, primaerfaktor_1, heizwertfaktor_1, coe_1] = [
|
||||||
|
1, 1, 1, 1,
|
||||||
|
];
|
||||||
|
if (this.energietraeger_1 && this.energietraeger_einheit_heizquelle_1) {
|
||||||
|
[umrechnungsfaktor, primaerfaktor, heizwertfaktor, coe] =
|
||||||
|
getHeizwertfaktor(
|
||||||
|
this.energietraeger_1,
|
||||||
|
this.energietraeger_einheit_heizquelle_1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.energietraeger_2 && this.energietraeger_einheit_heizquelle_2) {
|
||||||
|
[umrechnungsfaktor_1, primaerfaktor_1, heizwertfaktor_1, coe_1] =
|
||||||
|
getHeizwertfaktor(
|
||||||
|
this.energietraeger_2,
|
||||||
|
this.energietraeger_einheit_heizquelle_2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let verbrauch_1_kwh =
|
||||||
|
(this.energieverbrauch_1_heizquelle_1 * umrechnungsfaktor) /
|
||||||
|
heizwertfaktor;
|
||||||
|
let verbrauch_2_kwh =
|
||||||
|
(this.energieverbrauch_2_heizquelle_1 * umrechnungsfaktor) /
|
||||||
|
heizwertfaktor;
|
||||||
|
let verbrauch_3_kwh =
|
||||||
|
(this.energieverbrauch_3_heizquelle_1 * umrechnungsfaktor) /
|
||||||
|
heizwertfaktor;
|
||||||
|
let verbrauch_4_kwh =
|
||||||
|
(this.energieverbrauch_1_heizquelle_2 * umrechnungsfaktor_1) /
|
||||||
|
heizwertfaktor_1;
|
||||||
|
let verbrauch_5_kwh =
|
||||||
|
(this.energieverbrauch_2_heizquelle_2 * umrechnungsfaktor_1) /
|
||||||
|
heizwertfaktor_1;
|
||||||
|
let verbrauch_6_kwh =
|
||||||
|
(this.energieverbrauch_3_heizquelle_2 * umrechnungsfaktor_1) /
|
||||||
|
heizwertfaktor_1;
|
||||||
|
|
||||||
|
let warmwasserZuschlag = 0;
|
||||||
|
let leerstandsZuschlag = 0;
|
||||||
|
let kuehlungsZuschlag = 0;
|
||||||
|
if (this.anteil_warmwasser_1 == 0) {
|
||||||
|
warmwasserZuschlag = 20 * this.energetische_nutzfläche * 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.leerstand > 0) {
|
||||||
|
let durchschnittsKlimafaktor =
|
||||||
|
klimafaktoren.reduce((a, b) => a + b, 0) / 3;
|
||||||
|
|
||||||
|
leerstandsZuschlag =
|
||||||
|
((verbrauch_1_kwh +
|
||||||
|
verbrauch_2_kwh +
|
||||||
|
verbrauch_3_kwh +
|
||||||
|
verbrauch_4_kwh +
|
||||||
|
verbrauch_5_kwh +
|
||||||
|
verbrauch_6_kwh) *
|
||||||
|
(this.leerstand / 100)) /
|
||||||
|
durchschnittsKlimafaktor;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (energiequelle_2_nutzung[3]) {
|
||||||
|
kuehlungsZuschlag = 6 * this.energetische_nutzfläche * 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
let anteil_heizung = 1 - this.anteil_warmwasser_1 / 100;
|
||||||
|
let anteil_warmwasser = this.anteil_warmwasser_1 / 100;
|
||||||
|
let Energieverbrauchskennwert =
|
||||||
|
(anteil_heizung *
|
||||||
|
(verbrauch_1_kwh + verbrauch_4_kwh) *
|
||||||
|
klimafaktoren[0] +
|
||||||
|
anteil_warmwasser * (verbrauch_1_kwh + verbrauch_4_kwh) +
|
||||||
|
anteil_heizung *
|
||||||
|
(verbrauch_2_kwh + verbrauch_5_kwh) *
|
||||||
|
klimafaktoren[1] +
|
||||||
|
anteil_warmwasser * (verbrauch_2_kwh + verbrauch_5_kwh) +
|
||||||
|
anteil_heizung *
|
||||||
|
(verbrauch_3_kwh + verbrauch_6_kwh) *
|
||||||
|
klimafaktoren[2] +
|
||||||
|
anteil_warmwasser * (verbrauch_3_kwh + verbrauch_6_kwh) +
|
||||||
|
warmwasserZuschlag +
|
||||||
|
leerstandsZuschlag +
|
||||||
|
kuehlungsZuschlag) /
|
||||||
|
3 /
|
||||||
|
this.energetische_nutzfläche;
|
||||||
|
|
||||||
|
return Energieverbrauchskennwert;
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/lib/Klimafaktoren.ts
Normal file
13
src/lib/Klimafaktoren.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import moment from "moment";
|
||||||
|
import { memoize } from "./Memization";
|
||||||
|
|
||||||
|
export const getKlimafaktorenClient = memoize<Promise<number[]>>(async (date: Date, zip: string) => {
|
||||||
|
const response = await fetch(`/api/klimafaktoren?date=${moment(date).format("YYYY-MM-DD")}&zip=${zip}`);
|
||||||
|
const json = await response.json();
|
||||||
|
|
||||||
|
return json;
|
||||||
|
});
|
||||||
|
|
||||||
|
export const getKlimafaktorenServer = memoize(async (date: Date, zip: string) => {
|
||||||
|
|
||||||
|
});
|
||||||
18
src/lib/Memization.ts
Normal file
18
src/lib/Memization.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
type MemoizedFunction<T> = (...args: any[]) => T;
|
||||||
|
|
||||||
|
export function memoize<T>(func: (...args: any[]) => T): MemoizedFunction<T> {
|
||||||
|
const cache = new Map<string, T>();
|
||||||
|
|
||||||
|
return (...args: any[]): T => {
|
||||||
|
const key = JSON.stringify(args);
|
||||||
|
|
||||||
|
if (cache.has(key)) {
|
||||||
|
return cache.get(key)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = func(...args);
|
||||||
|
cache.set(key, result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user