xxf_react 0.7.0 → 0.7.2

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
- * .post<User, CreateUserDTO>('createUser', {
16
- * path: '/users',
17
- * })
24
+ * .get<User[]>('getUsers', { path: '/users' })
25
+ * .post<User>('createUser', { path: '/users' })
18
26
  * .build()
19
27
  *
20
- * // 使用 API
21
- * const user = await userApi.getUser({ pathParams: { id: '123' } })
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.getUserList()) {
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 端点名称(K 从参数自动推断,无需手动指定)
79
93
  */
80
- get<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
94
+ get<K extends string, TResponse>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
81
95
  /**
82
96
  * 定义 POST 请求
97
+ * @param name 端点名称(K 从参数自动推断,无需手动指定)
83
98
  */
84
- post<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
99
+ post<K extends string, TResponse>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
85
100
  /**
86
101
  * 定义 PUT 请求
102
+ * @param name 端点名称(K 从参数自动推断,无需手动指定)
87
103
  */
88
- put<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
104
+ put<K extends string, TResponse>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
89
105
  /**
90
106
  * 定义 DELETE 请求
107
+ * @param name 端点名称(K 从参数自动推断,无需手动指定)
91
108
  */
92
- delete<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
109
+ delete<K extends string, TResponse>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
93
110
  /**
94
111
  * 定义 PATCH 请求
112
+ * @param name 端点名称(K 从参数自动推断,无需手动指定)
95
113
  */
96
- patch<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
114
+ patch<K extends string, TResponse>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<K, ApiEndpoint<TResponse>>>;
97
115
  /**
98
116
  * 通用端点定义
117
+ * K 放在前面,从 name 参数自动推断;TResponse 需要手动指定
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":"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"}
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
- * .post<User, CreateUserDTO>('createUser', {
16
- * path: '/users',
17
- * })
24
+ * .get<User[]>('getUsers', { path: '/users' })
25
+ * .post<User>('createUser', { path: '/users' })
18
26
  * .build()
19
27
  *
20
- * // 使用 API
21
- * const user = await userApi.getUser({ pathParams: { id: '123' } })
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.getUserList()) {
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 端点名称(K 从参数自动推断,无需手动指定)
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 端点名称(K 从参数自动推断,无需手动指定)
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 端点名称(K 从参数自动推断,无需手动指定)
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 端点名称(K 从参数自动推断,无需手动指定)
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 端点名称(K 从参数自动推断,无需手动指定)
81
99
  */
82
100
  patch(name, options) {
83
101
  return this.endpoint(name, { ...options, method: 'PATCH' });
84
102
  }
85
103
  /**
86
104
  * 通用端点定义
105
+ * K 放在前面,从 name 参数自动推断;TResponse 需要手动指定
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
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xxf_react",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",