xxf_react 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* API 构建器
|
|
3
3
|
*
|
|
4
|
-
* 使用 Builder 模式定义 API,类似 Android Retrofit
|
|
4
|
+
* 使用 Builder 模式定义 API,类似 Android Retrofit。
|
|
5
|
+
* 采用泛型累积模式,每次 .get() / .post() 调用都返回带有累积类型的新 Builder。
|
|
6
|
+
*
|
|
7
|
+
* ## 类型安全
|
|
8
|
+
*
|
|
9
|
+
* - 每个端点名称保留字面量类型(如 `'getUser'`)
|
|
10
|
+
* - 链式调用累积所有端点类型:`T & Record<K, ApiEndpoint<TResponse>>`
|
|
11
|
+
* - `build()` 后返回完整类型安全的 API 对象
|
|
12
|
+
* - 调用不存在的端点会产生编译错误
|
|
5
13
|
*
|
|
6
14
|
* @example
|
|
7
15
|
* ```ts
|
|
16
|
+
* // 定义 API
|
|
8
17
|
* const userApi = ApiBuilder.create({
|
|
9
18
|
* baseUrl: 'https://api.example.com',
|
|
10
19
|
* })
|
|
@@ -12,16 +21,20 @@
|
|
|
12
21
|
* path: '/users/{id}',
|
|
13
22
|
* cache: { mode: CacheMode.IfCache, ttl: 60000 },
|
|
14
23
|
* })
|
|
15
|
-
* .
|
|
16
|
-
*
|
|
17
|
-
* })
|
|
24
|
+
* .get<User[]>('getUsers', { path: '/users' })
|
|
25
|
+
* .post<User>('createUser', { path: '/users' })
|
|
18
26
|
* .build()
|
|
19
27
|
*
|
|
20
|
-
* //
|
|
21
|
-
*
|
|
28
|
+
* // ✅ 类型正确推断
|
|
29
|
+
* userApi.getUser({ pathParams: { id: '123' } }) // ApiStream<User>
|
|
30
|
+
* userApi.getUsers() // ApiStream<User[]>
|
|
31
|
+
* userApi.createUser({ body: { name: 'John' } }) // ApiStream<User>
|
|
32
|
+
*
|
|
33
|
+
* // ❌ 类型错误会被捕获
|
|
34
|
+
* userApi.unknownMethod() // Error: Property 'unknownMethod' does not exist
|
|
22
35
|
*
|
|
23
36
|
* // 多次响应
|
|
24
|
-
* for await (const { data, fromCache } of userApi.
|
|
37
|
+
* for await (const { data, fromCache } of userApi.getUser({ pathParams: { id: '123' } })) {
|
|
25
38
|
* console.log(data, fromCache)
|
|
26
39
|
* }
|
|
27
40
|
* ```
|
|
@@ -76,26 +89,32 @@ export declare class ApiBuilder<T extends ApiDefinition = Record<string, never>>
|
|
|
76
89
|
static from(kyInstance: ReturnType<typeof ky.create>, config?: Partial<HttpClientConfig>): ApiBuilder;
|
|
77
90
|
/**
|
|
78
91
|
* 定义 GET 请求
|
|
92
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
79
93
|
*/
|
|
80
|
-
get<TResponse>(name:
|
|
94
|
+
get<TResponse, K extends string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
|
|
81
95
|
/**
|
|
82
96
|
* 定义 POST 请求
|
|
97
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
83
98
|
*/
|
|
84
|
-
post<TResponse>(name:
|
|
99
|
+
post<TResponse, K extends string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
|
|
85
100
|
/**
|
|
86
101
|
* 定义 PUT 请求
|
|
102
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
87
103
|
*/
|
|
88
|
-
put<TResponse>(name:
|
|
104
|
+
put<TResponse, K extends string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
|
|
89
105
|
/**
|
|
90
106
|
* 定义 DELETE 请求
|
|
107
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
91
108
|
*/
|
|
92
|
-
delete<TResponse>(name:
|
|
109
|
+
delete<TResponse, K extends string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
|
|
93
110
|
/**
|
|
94
111
|
* 定义 PATCH 请求
|
|
112
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
95
113
|
*/
|
|
96
|
-
patch<TResponse>(name:
|
|
114
|
+
patch<TResponse, K extends string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
|
|
97
115
|
/**
|
|
98
116
|
* 通用端点定义
|
|
117
|
+
* 使用 `as unknown as` 类型断言绕过 TS 限制,实现泛型累积
|
|
99
118
|
*/
|
|
100
119
|
private endpoint;
|
|
101
120
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiBuilder.d.ts","sourceRoot":"","sources":["../../../src/http/api/ApiBuilder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ApiBuilder.d.ts","sourceRoot":"","sources":["../../../src/http/api/ApiBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* API 构建器
|
|
3
3
|
*
|
|
4
|
-
* 使用 Builder 模式定义 API,类似 Android Retrofit
|
|
4
|
+
* 使用 Builder 模式定义 API,类似 Android Retrofit。
|
|
5
|
+
* 采用泛型累积模式,每次 .get() / .post() 调用都返回带有累积类型的新 Builder。
|
|
6
|
+
*
|
|
7
|
+
* ## 类型安全
|
|
8
|
+
*
|
|
9
|
+
* - 每个端点名称保留字面量类型(如 `'getUser'`)
|
|
10
|
+
* - 链式调用累积所有端点类型:`T & Record<K, ApiEndpoint<TResponse>>`
|
|
11
|
+
* - `build()` 后返回完整类型安全的 API 对象
|
|
12
|
+
* - 调用不存在的端点会产生编译错误
|
|
5
13
|
*
|
|
6
14
|
* @example
|
|
7
15
|
* ```ts
|
|
16
|
+
* // 定义 API
|
|
8
17
|
* const userApi = ApiBuilder.create({
|
|
9
18
|
* baseUrl: 'https://api.example.com',
|
|
10
19
|
* })
|
|
@@ -12,16 +21,20 @@
|
|
|
12
21
|
* path: '/users/{id}',
|
|
13
22
|
* cache: { mode: CacheMode.IfCache, ttl: 60000 },
|
|
14
23
|
* })
|
|
15
|
-
* .
|
|
16
|
-
*
|
|
17
|
-
* })
|
|
24
|
+
* .get<User[]>('getUsers', { path: '/users' })
|
|
25
|
+
* .post<User>('createUser', { path: '/users' })
|
|
18
26
|
* .build()
|
|
19
27
|
*
|
|
20
|
-
* //
|
|
21
|
-
*
|
|
28
|
+
* // ✅ 类型正确推断
|
|
29
|
+
* userApi.getUser({ pathParams: { id: '123' } }) // ApiStream<User>
|
|
30
|
+
* userApi.getUsers() // ApiStream<User[]>
|
|
31
|
+
* userApi.createUser({ body: { name: 'John' } }) // ApiStream<User>
|
|
32
|
+
*
|
|
33
|
+
* // ❌ 类型错误会被捕获
|
|
34
|
+
* userApi.unknownMethod() // Error: Property 'unknownMethod' does not exist
|
|
22
35
|
*
|
|
23
36
|
* // 多次响应
|
|
24
|
-
* for await (const { data, fromCache } of userApi.
|
|
37
|
+
* for await (const { data, fromCache } of userApi.getUser({ pathParams: { id: '123' } })) {
|
|
25
38
|
* console.log(data, fromCache)
|
|
26
39
|
* }
|
|
27
40
|
* ```
|
|
@@ -54,36 +67,42 @@ export class ApiBuilder {
|
|
|
54
67
|
}
|
|
55
68
|
/**
|
|
56
69
|
* 定义 GET 请求
|
|
70
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
57
71
|
*/
|
|
58
72
|
get(name, options) {
|
|
59
73
|
return this.endpoint(name, { ...options, method: 'GET' });
|
|
60
74
|
}
|
|
61
75
|
/**
|
|
62
76
|
* 定义 POST 请求
|
|
77
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
63
78
|
*/
|
|
64
79
|
post(name, options) {
|
|
65
80
|
return this.endpoint(name, { ...options, method: 'POST' });
|
|
66
81
|
}
|
|
67
82
|
/**
|
|
68
83
|
* 定义 PUT 请求
|
|
84
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
69
85
|
*/
|
|
70
86
|
put(name, options) {
|
|
71
87
|
return this.endpoint(name, { ...options, method: 'PUT' });
|
|
72
88
|
}
|
|
73
89
|
/**
|
|
74
90
|
* 定义 DELETE 请求
|
|
91
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
75
92
|
*/
|
|
76
93
|
delete(name, options) {
|
|
77
94
|
return this.endpoint(name, { ...options, method: 'DELETE' });
|
|
78
95
|
}
|
|
79
96
|
/**
|
|
80
97
|
* 定义 PATCH 请求
|
|
98
|
+
* @param name 端点名称(使用字面量类型实现类型累积)
|
|
81
99
|
*/
|
|
82
100
|
patch(name, options) {
|
|
83
101
|
return this.endpoint(name, { ...options, method: 'PATCH' });
|
|
84
102
|
}
|
|
85
103
|
/**
|
|
86
104
|
* 通用端点定义
|
|
105
|
+
* 使用 `as unknown as` 类型断言绕过 TS 限制,实现泛型累积
|
|
87
106
|
*/
|
|
88
107
|
endpoint(name, options) {
|
|
89
108
|
var _a;
|
|
@@ -96,6 +115,7 @@ export class ApiBuilder {
|
|
|
96
115
|
cache: options.cache,
|
|
97
116
|
};
|
|
98
117
|
this.endpoints.set(name, config);
|
|
118
|
+
// 关键:返回 this,但类型已经累积
|
|
99
119
|
return this;
|
|
100
120
|
}
|
|
101
121
|
/**
|