Skip to content

Commit 7c6eb5a

Browse files
committed
fix(types): handle builtin objects and tuples in ProxifyArg
Refactored ProxifyArg to properly handle special global types like Date, RegExp, Map, Set, and typed arrays without recursively expanding their properties. Added ProxifyArgTuple to preserve tuple structure when converting array types.
1 parent 6bef124 commit 7c6eb5a

1 file changed

Lines changed: 58 additions & 1 deletion

File tree

src/types.ts

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,69 @@ export type ProxyExpression<T = unknown> = {
1212
readonly [ProxyExpression]: T;
1313
};
1414

15+
/**
16+
* 特殊全局类型 - 这些类型作为参数时允许直接传入原始值
17+
* 不需要递归展开其属性
18+
*/
19+
type BuiltinObjects =
20+
| Date
21+
| RegExp
22+
| Error
23+
| URL
24+
| URLSearchParams
25+
| ArrayBuffer
26+
| SharedArrayBuffer
27+
| DataView
28+
| Int8Array
29+
| Uint8Array
30+
| Uint8ClampedArray
31+
| Int16Array
32+
| Uint16Array
33+
| Int32Array
34+
| Uint32Array
35+
| Float32Array
36+
| Float64Array
37+
| BigInt64Array
38+
| BigUint64Array;
39+
40+
/**
41+
* 将数组/元组类型的每个元素转换为 ProxifyArg
42+
* 保留元组的结构信息
43+
*/
44+
type ProxifyArgTuple<T extends readonly unknown[]> = T extends readonly [infer Head, ...infer Tail]
45+
? [ProxifyArg<Head>, ...ProxifyArgTuple<Tail>]
46+
: T extends readonly []
47+
? []
48+
: T extends readonly (infer E)[]
49+
? readonly ProxifyArg<E>[]
50+
: never;
51+
52+
export type ProxifyArg<T> =
53+
| Proxify<T>
54+
| (T extends BuiltinObjects | string | number | boolean | bigint | undefined | null
55+
? T
56+
: T extends readonly unknown[]
57+
? ProxifyArgTuple<T>
58+
: T extends Map<infer K, infer V>
59+
? Map<ProxifyArg<K>, ProxifyArg<V>>
60+
: T extends Set<infer E>
61+
? Set<ProxifyArg<E>>
62+
: T extends WeakMap<infer K, infer V>
63+
? WeakMap<ProxifyArg<K>, ProxifyArg<V>>
64+
: T extends WeakSet<infer E>
65+
? WeakSet<ProxifyArg<E>>
66+
: T extends Promise<infer R>
67+
? Promise<ProxifyArg<R>>
68+
: T extends (...args: infer _A) => infer _R
69+
? never
70+
: { [K in keyof T]: ProxifyArg<T[K]> });
71+
1572
/**
1673
* 处理函数参数的 Proxy 转换
1774
* 参数可以是原始值或对应的 Proxy
1875
*/
1976
export type ProxifyArgs<T extends unknown[]> = {
20-
[K in keyof T]: T[K] | Proxify<T[K]>;
77+
[K in keyof T]: ProxifyArg<T[K]>;
2178
};
2279

2380
/**

0 commit comments

Comments
 (0)