diff --git a/src/providers/RouterProvider.tsx b/src/providers/RouterProvider.tsx index 109d971..e70ce13 100644 --- a/src/providers/RouterProvider.tsx +++ b/src/providers/RouterProvider.tsx @@ -193,7 +193,7 @@ export function RouterProvider({ // Check storage for pending context menu data storageUtil - .get('contextMenu/pendingData', undefined) + .get('contextMenu/pendingData') .then((pendingData) => { if ( pendingData && diff --git a/src/utils/__tests__/chromeStorage.test.ts b/src/utils/__tests__/chromeStorage.test.ts index aeba7c7..cb4f0d5 100644 --- a/src/utils/__tests__/chromeStorage.test.ts +++ b/src/utils/__tests__/chromeStorage.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, expectTypeOf } from 'vitest'; import { storageUtil } from '@/utils/chromeStorage'; describe('chromeStorage', () => { @@ -75,6 +75,20 @@ describe('chromeStorage', () => { }); }); + describe('get 类型签名', () => { + it('无默认值时应推断为可选返回类型', () => { + const getWithoutDefault = () => storageUtil.get('app/theme'); + expectTypeOf>().toEqualTypeOf< + Promise + >(); + }); + + it('有默认值时应推断为确定返回类型', () => { + const getWithDefault = () => storageUtil.get('app/theme', 'light'); + expectTypeOf>().toEqualTypeOf>(); + }); + }); + describe('set', () => { it('应该成功设置字符串值', async () => { (chrome.storage.local.set as any).mockResolvedValue(undefined); diff --git a/src/utils/chromeStorage.ts b/src/utils/chromeStorage.ts index df9ec17..4e46085 100644 --- a/src/utils/chromeStorage.ts +++ b/src/utils/chromeStorage.ts @@ -1,12 +1,12 @@ import { StorageSchema } from '@/types/storage'; class StorageUtils { - async get(key: K): Promise; - async get( key: K, - defaultValue?: StorageSchema[K], - ): Promise; + defaultValue: StorageSchema[K], + ): Promise; + + async get(key: K): Promise; /** * 获取值 @@ -19,7 +19,10 @@ class StorageUtils { defaultValue?: StorageSchema[K], ): Promise { const result = await chrome.storage.local.get([key]); - return (result[key] ?? defaultValue) as StorageSchema[K] | undefined; + if (defaultValue !== undefined) { + return (result[key] ?? defaultValue) as StorageSchema[K]; + } + return result[key] as StorageSchema[K] | undefined; } /** diff --git a/src/utils/useContextMenuData.ts b/src/utils/useContextMenuData.ts index ecc7ea2..d26b2ae 100644 --- a/src/utils/useContextMenuData.ts +++ b/src/utils/useContextMenuData.ts @@ -26,7 +26,7 @@ export function useContextMenuData({ featureKey, onData }: UseContextMenuDataOpt useEffect(() => { const checkAndConsumeData = async () => { try { - const data = await storageUtil.get(STORAGE_KEY, undefined); + const data = await storageUtil.get(STORAGE_KEY); if (!data) return; @@ -55,7 +55,7 @@ export function useContextMenuData({ featureKey, onData }: UseContextMenuDataOpt if (newData && newData.featureKey === featureKey) { void (async () => { try { - const data = await storageUtil.get(STORAGE_KEY, undefined); + const data = await storageUtil.get(STORAGE_KEY); if (!data) return; if (data.featureKey !== featureKey) return; if (Date.now() - data.timestamp > CONTEXT_MENU_DATA_EXPIRY_MS) {