feat(common): 添加工具

This commit is contained in:
2026-04-20 17:54:26 +08:00
parent 7ff223fa32
commit b10d613987
64 changed files with 8342 additions and 16243 deletions
+54 -10
View File
@@ -24,7 +24,6 @@ export function getCurrentPage() {
return pages[pages.length - 1];
}
/**
* 使用 TypeScript 工具类型实现自动类型推断的 toPromise
*
@@ -39,10 +38,17 @@ export function getCurrentPage() {
// type ExtractFirstParameter<T> = Parameters<T>[0]; // 这样也可以,但需要T是函数类型
// 方法2:使用条件类型实现(更灵活,等价于 Parameters<T>[0]
type ExtractFirstParameter<T> = T extends (arg: infer P, ...args: unknown[]) => unknown ? P : never;
type ExtractFirstParameter<T> = T extends (
arg: infer P,
...args: unknown[]
) => unknown
? P
: never;
// 提取 success 回调的参数类型(类似 ReturnType 的思路,但提取回调参数)
type ExtractSuccessResult<T> = T extends { success?: (result: infer R) => void } ? R : never;
type ExtractSuccessResult<T> = T extends { success?: (result: infer R) => void }
? R
: never;
// 提取函数参数类型并排除回调函数(用于args参数)
type ExtractOptions<T> = T extends (options: infer P) => unknown
@@ -103,7 +109,6 @@ export function toPromise<F extends (options: Record<string, unknown>) => void>(
});
}
export function showToast(
title: string,
icon: "success" | "loading" | "error" | "none" = "none",
@@ -139,12 +144,9 @@ export async function getCanvasImageData(
) {
const context = uni.createCanvasContext(canvasId, thisArg);
const imgRes = await toPromise(
uni.downloadFile,
{
url,
},
);
const imgRes = await toPromise(uni.downloadFile, {
url,
});
console.log(imgRes);
context.drawImage(imgRes.tempFilePath, x, y, width, height);
@@ -243,3 +245,45 @@ export function checkAndroidPermission(permissionList: string[]) {
});
// #endif
}
/**
* 异步计算元素距离
*/
export async function calculateDistanceBySelectorAsync(
scrollViewSelector: string,
selector: string,
offsetTop = 0,
): Promise<number> {
const scrollViewScrollOffsetPromise = new Promise<UniApp.NodeInfo>(
(resolve) => {
const query = uni.createSelectorQuery();
query.select(scrollViewSelector).scrollOffset((res) => {
resolve(res as UniApp.NodeInfo);
});
query.exec();
},
);
const targetElementPromise = new Promise<UniApp.NodeInfo>((resolve) => {
const query = uni.createSelectorQuery();
query.select(selector).boundingClientRect((rect) => {
resolve(rect as UniApp.NodeInfo);
});
query.exec();
});
const [scrollViewScrollOffset, targetElementRect] = await Promise.all([
scrollViewScrollOffsetPromise,
targetElementPromise,
]);
if (!scrollViewScrollOffset || !targetElementRect) {
return 0;
}
const distance =
(targetElementRect.top ?? 0) +
(scrollViewScrollOffset.scrollTop ?? 0) -
offsetTop;
return Math.max(0, Math.round(distance));
}