refactor(RouterProvider, chromeStorage, useContextMenuData): 更新存储获取逻辑以移除默认值参数

- 在 RouterProvider 和 useContextMenuData 中更新对 storageUtil.get 的调用,移除默认值参数,简化逻辑。
- 修改 chromeStorage 中的 get 方法签名,确保在没有默认值时返回可选类型,并添加相应的单元测试以验证类型推断。
This commit is contained in:
雨霖铃
2026-06-19 20:47:43 +08:00
parent ed383dd319
commit 47d74f999e
4 changed files with 26 additions and 9 deletions
+1 -1
View File
@@ -193,7 +193,7 @@ export function RouterProvider({
// Check storage for pending context menu data // Check storage for pending context menu data
storageUtil storageUtil
.get('contextMenu/pendingData', undefined) .get('contextMenu/pendingData')
.then((pendingData) => { .then((pendingData) => {
if ( if (
pendingData && pendingData &&
+15 -1
View File
@@ -1,4 +1,4 @@
import { describe, expect, it } from 'vitest'; import { describe, expect, it, expectTypeOf } from 'vitest';
import { storageUtil } from '@/utils/chromeStorage'; import { storageUtil } from '@/utils/chromeStorage';
describe('chromeStorage', () => { describe('chromeStorage', () => {
@@ -75,6 +75,20 @@ describe('chromeStorage', () => {
}); });
}); });
describe('get 类型签名', () => {
it('无默认值时应推断为可选返回类型', () => {
const getWithoutDefault = () => storageUtil.get('app/theme');
expectTypeOf<ReturnType<typeof getWithoutDefault>>().toEqualTypeOf<
Promise<string | undefined>
>();
});
it('有默认值时应推断为确定返回类型', () => {
const getWithDefault = () => storageUtil.get('app/theme', 'light');
expectTypeOf<ReturnType<typeof getWithDefault>>().toEqualTypeOf<Promise<string>>();
});
});
describe('set', () => { describe('set', () => {
it('应该成功设置字符串值', async () => { it('应该成功设置字符串值', async () => {
(chrome.storage.local.set as any).mockResolvedValue(undefined); (chrome.storage.local.set as any).mockResolvedValue(undefined);
+8 -5
View File
@@ -1,12 +1,12 @@
import { StorageSchema } from '@/types/storage'; import { StorageSchema } from '@/types/storage';
class StorageUtils { class StorageUtils {
async get<K extends keyof StorageSchema>(key: K): Promise<StorageSchema[K]>;
async get<K extends keyof StorageSchema>( async get<K extends keyof StorageSchema>(
key: K, key: K,
defaultValue?: StorageSchema[K], defaultValue: StorageSchema[K],
): Promise<StorageSchema[K] | undefined>; ): Promise<StorageSchema[K]>;
async get<K extends keyof StorageSchema>(key: K): Promise<StorageSchema[K] | undefined>;
/** /**
* 获取值 * 获取值
@@ -19,7 +19,10 @@ class StorageUtils {
defaultValue?: StorageSchema[K], defaultValue?: StorageSchema[K],
): Promise<StorageSchema[K] | undefined> { ): Promise<StorageSchema[K] | undefined> {
const result = await chrome.storage.local.get([key]); 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;
} }
/** /**
+2 -2
View File
@@ -26,7 +26,7 @@ export function useContextMenuData({ featureKey, onData }: UseContextMenuDataOpt
useEffect(() => { useEffect(() => {
const checkAndConsumeData = async () => { const checkAndConsumeData = async () => {
try { try {
const data = await storageUtil.get(STORAGE_KEY, undefined); const data = await storageUtil.get(STORAGE_KEY);
if (!data) return; if (!data) return;
@@ -55,7 +55,7 @@ export function useContextMenuData({ featureKey, onData }: UseContextMenuDataOpt
if (newData && newData.featureKey === featureKey) { if (newData && newData.featureKey === featureKey) {
void (async () => { void (async () => {
try { try {
const data = await storageUtil.get(STORAGE_KEY, undefined); const data = await storageUtil.get(STORAGE_KEY);
if (!data) return; if (!data) return;
if (data.featureKey !== featureKey) return; if (data.featureKey !== featureKey) return;
if (Date.now() - data.timestamp > CONTEXT_MENU_DATA_EXPIRY_MS) { if (Date.now() - data.timestamp > CONTEXT_MENU_DATA_EXPIRY_MS) {