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
- * .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 端点名称(使用字面量类型实现类型累积)
79
93
  */
80
- get<TResponse>(name: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
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: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
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: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
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: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
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: string, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & Record<typeof name, ApiEndpoint<TResponse>>>;
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":"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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 端点名称(使用字面量类型实现类型累积)
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
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xxf_react",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",