// 示例:如何使用 AkSupa 的 executeAs() 类型转换功能 // 定义数据类型 export type User = { id: number; name: string; email: string; created_at: string; avatar_url?: string; } export type Post = { id: number; title: string; content: string; user_id: number; created_at: string; updated_at: string; } // 使用示例 import AkSupa from '@/components/supadb/aksupa.uts'; export async function demonstrateTypedQueries() { const supa = new AkSupa('https://your-project.supabase.co', 'your-anon-key'); // 1. 查询数据 - 使用链式调用 + executeAs() const usersResult = await supa .from('users') .select('*') .eq('status', 'active') .limit(10) .executeAs(); // 现在 usersResult.data 是 User[] 类型,而不是 UTSJSONObject if (usersResult.data != null) { usersResult.data.forEach(user => { console.log(`用户: ${user.name}, 邮箱: ${user.email}`); }); } // 2. 单条记录查询 const userResult = await supa .from('users') .select('*') .eq('id', 1) .single() .executeAs(); if (userResult.data != null) { console.log(`用户名: ${userResult.data.name}`); } // 3. 插入数据 const newUser = { name: '新用户', email: 'newuser@example.com' } as UTSJSONObject; const insertResult = await supa .from('users') .insert(newUser) .executeAs(); // 4. 更新数据 const updateResult = await supa .from('users') .update({ name: '更新的名称' } as UTSJSONObject) .eq('id', 1) .executeAs(); // 5. 删除数据 const deleteResult = await supa .from('users') .delete() .eq('id', 1) .executeAs(); // 6. RPC 调用 const rpcResult = await supa .from('') // RPC 不需要 table .rpc('get_user_stats', { user_id: 1 } as UTSJSONObject) .executeAs<{ total_posts: number; total_likes: number }>(); // 7. 复杂查询示例 const complexQuery = await supa .from('posts') .select('*, users!posts_user_id_fkey(*)') .eq('status', 'published') .gt('created_at', '2024-01-01') .order('created_at', { ascending: false }) .limit(20) .executeAs(); return { users: usersResult.data, user: userResult.data, newUser: insertResult.data, updated: updateResult.data, deleted: deleteResult.data, stats: rpcResult.data, posts: complexQuery.data }; } // 平台兼容性说明: // // Android 平台(uni-app x 3.90+): // - 使用 UTSJSONObject.parse() 进行真正的类型转换 // - 数据会被正确解析为指定的类型 T // - 如果转换失败,会 fallback 到原始数据 // // 其他平台(Web、iOS、HarmonyOS): // - 使用 as 进行类型断言 // - 这只是 TypeScript 编译时的类型提示,运行时仍然是原始数据 // - 但提供了更好的开发体验和类型安全 // // 使用优势: // 1. 统一的 API - 只需要记住 executeAs() 一个方法 // 2. 链式调用 - 可以和所有其他方法组合使用 // 3. 类型安全 - 编译时类型检查,运行时类型转换(Android) // 4. 简洁明了 - 不需要多个 selectAs/insertAs/updateAs 等方法