TypeScript at StorageManager
Ipinaliliwanag ng artikulong ito ang TypeScript at StorageManager.
Nagbibigay kami ng mga praktikal na halimbawa upang ipaliwanag ang TypeScript at StorageManager.
YouTube Video
TypeScript at StorageManager
Ano ang StorageManager?
Ang StorageManager ay isang API na nagpapahintulot sa mga web application na tantiyahin kung gaano karaming storage ang ginagamit at gaano kalaki ang natitirang kapasidad. Nagbibigay din ito ng persistence request (persist()) upang maiwasan ang awtomatikong pagtanggal ng data ng user o browser. Dahil dito, maaari mong malaman kung sapat ang libreng espasyo o kung may posibilidad na awtomatikong mabura ang data, gaya kapag nag-iimbak ng malaking datos sa IndexedDB para sa offline na aplikasyon.
Pag-detect ng Feature
Una, tiyakin kung sinusuportahan ng browser ang navigator.storage.
1// TypeScript: feature detection for StorageManager
2function supportsStorageManager(): boolean {
3 return typeof navigator !== "undefined" &&
4 typeof navigator.storage !== "undefined" &&
5 typeof navigator.storage.estimate === "function";
6}
7
8// Example usage
9if (supportsStorageManager()) {
10 console.log("StorageManager is supported.");
11} else {
12 console.warn("StorageManager not supported. Falling back to localStorage or IndexedDB.");
13}- Tinitiyak ng function na ito ang pagkakaroon ng StorageManager API sa bawat yugto.
- Dahil ang
navigator.storageay maaaring hindi available sa ilang browser gaya ng Safari, mahalaga na kumpirmahin ang pag-iral nito nang ligtas gamit angtypeof.
Tantiya ng Paggamit ng Storage (estimate())
Pagkatapos suriin ang functionality gamit ang supportsStorageManager(), kunin ang paggamit (usage) at quota (quota) mula sa navigator.storage.estimate().
1// TypeScript: safely get storage estimate
2async function getStorageEstimate(): Promise<{ usage: number; quota: number } | null> {
3 if (!supportsStorageManager()) {
4 console.warn("StorageManager not supported.");
5 return null;
6 }
7
8 const estimate = await navigator.storage.estimate();
9 return { usage: estimate.usage ?? 0, quota: estimate.quota ?? 0 };
10}
11
12// Example usage
13getStorageEstimate().then(result => {
14 if (result) {
15 console.log(`Usage: ${result.usage} bytes / Quota: ${result.quota} bytes`);
16 }
17});- Ang function na ito ay laging gumagana nang ligtas at magbabalik ng
nullkung hindi ito suportado ng browser. - Ang
usageatquotaay tinatayang halaga at maaaring magkaiba sa bawat browser.
Humiling ng Data Persistence (persist())
Gamitin ang persist() upang hilingin ang persistence para hindi awtomatikong mabura ng browser ang mahahalagang data (hal. offline cache). Gayunpaman, hindi ito palaging matagumpay sa lahat ng environment.
1// TypeScript: safely request persistent storage
2async function requestPersistence(): Promise<boolean> {
3 if (!supportsStorageManager()) {
4 console.warn("StorageManager not supported.");
5 return false;
6 }
7
8 if (typeof navigator.storage.persist !== "function") {
9 console.warn("persist() not available in this browser.");
10 return false;
11 }
12
13 try {
14 const granted = await navigator.storage.persist();
15 return Boolean(granted);
16 } catch (err) {
17 console.error("persist() error:", err);
18 return false;
19 }
20}
21
22// Example usage
23requestPersistence().then(granted => {
24 console.log("Persistence granted?", granted);
25});- Kung magtagumpay ang
persist(), hindi awtomatikong buburahin ng browser ang data, maliban na lamang kung mano-manong gagawin ito ng user. Gayunpaman, maaaring tanggihan ang mga request ayon sa aksyon ng user o mga setting ng browser.
Tiyakin ang Available na Storage Bago Mag-save ng Data
Suriin muna ang libreng espasyo bago mag-save ng malaking data upang maiwasan ang pagkakabigo ng pagsulat (QuotaExceededError).
1// TypeScript: ensure enough space before writing
2async function ensureSpaceAndWrite(neededBytes: number, writeFn: () => Promise<void>): Promise<boolean> {
3 const estimate = await getStorageEstimate();
4 if (!estimate) {
5 console.warn("Cannot check storage space. Proceeding without validation.");
6 await writeFn();
7 return true;
8 }
9
10 const free = estimate.quota - estimate.usage;
11 if (free < neededBytes) {
12 console.warn(`Not enough space. Free: ${free} bytes, needed: ${neededBytes} bytes.`);
13 return false;
14 }
15
16 await writeFn();
17 return true;
18}
19
20// Example usage
21ensureSpaceAndWrite(10 * 1024 * 1024, async () => {
22 console.log("Saving large data...");
23});- Sa pamamagitan ng pag-check ng available storage bago mag-save, mababawasan mo ang panganib ng pagkaantala ng pagsulat bunsod ng kakulangan sa kapasidad.
Type-Safe na Pamamahala ng localStorage sa TypeScript
Ang localStorage ay maginhawa para sa pag-iimbak ng magagaan na configuration data at katulad na impormasyon.
Ang sumusunod na klase ay gumagamit ng generics upang makabuo ng type-safe wrapper.
1// TypeScript: typed localStorage wrapper
2type Serializer<T> = {
3 serialize: (v: T) => string;
4 deserialize: (s: string) => T;
5};
6
7class TypedLocalStorage<K extends string, V> {
8 constructor(private storage: Storage, private serializer: Serializer<V>) {}
9
10 set(key: K, value: V): void {
11 this.storage.setItem(key, this.serializer.serialize(value));
12 }
13
14 get(key: K): V | null {
15 const raw = this.storage.getItem(key);
16 if (raw === null) return null;
17 try {
18 return this.serializer.deserialize(raw);
19 } catch {
20 return null;
21 }
22 }
23
24 remove(key: K): void {
25 this.storage.removeItem(key);
26 }
27
28 clear(): void {
29 this.storage.clear();
30 }
31}
32
33// Example usage
34const jsonSerializer: Serializer<any> = {
35 serialize: v => JSON.stringify(v),
36 deserialize: s => JSON.parse(s),
37};
38
39const appStorage = new TypedLocalStorage<'theme' | 'token', any>(localStorage, jsonSerializer);
40appStorage.set('theme', { dark: true });
41console.log(appStorage.get('theme'));- Ang klase na ito ay tumutulong mabawasan ang panganib ng maling uri ng data sa pag-store o pagkuha.
Mga Praktikal na Pagsasaalang-alang at Pinakamahuhusay na Gawi
-
Laging suriin kung sinusuportahan ng browser ang StorageManager Dahil bago pa lamang ang StorageManager bilang isang API, tiyaking nariyan ito bago gamitin.
-
Bigyang-pansin ang limitasyon at compatibility ng storage Ang halaga na ibinabalik ng
estimate()ay nagkakaiba depende sa browser at tinatayang halaga lamang. -
Isaalang-alang ang Asynchronous APIs sa Disenyo Ang
estimate()atpersist()ay promise-based asynchronous APIs. I-disenyo ang iyong code para hindi hadlangan ang UI. -
Mga Pagsusuri sa Seguridad Huwag mag-imbak ng sensitibong impormasyon tulad ng access tokens sa
localStorage. Isaalang-alang ang paggamit ng HttpOnly cookies o encryption kung maaari. -
Disenyo ng Fallback Kung ang
supportsStorageManager()ay magbalik ng false, magbigay ng solusyon para gumamit na lang nglocalStorageoIndexedDB.
Buod
Sa pamamagitan ng feature detection gamit ang supportsStorageManager(), maaari mong suportahan nang ligtas ang lahat ng environment, suriin ang usage at quota gamit ang navigator.storage.estimate(), at humiling ng persistence gamit ang persist(). Sa TypeScript, gumamit ng wrapper functions at type definitions upang magsulat ng malinaw at ligtas na code. Ang pangunahing daloy ay: suriin ang pag-iral, tanteahin, humiling ng persistence, at suriin ang kapasidad bago magsulat sa storage.
Maaari mong sundan ang artikulo sa itaas gamit ang Visual Studio Code sa aming YouTube channel. Paki-check din ang aming YouTube channel.