TypeScript中能否向函数传入动态类型?(TS错误码2322)
问题解决与动态类型应用说明
1. 修复TS错误码2322的问题
你遇到的TS2322错误,是因为transformRequest函数声明返回Promise<T>,但实际返回的{ error: ... }对象并不符合泛型参数T的结构(T是IApiResponse的子类型,比如IUserData)。
要修复这个问题,有两种实用方案:
- 类型断言(测试场景适用)
如果是测试时需要强制返回错误对象,可以用类型断言告知TS返回值符合T类型:async function transformRequest<T>(data: T): Promise<T> { return { error: { status: 404, name: 'NotFound', message: 'Not Found', } } as T; } - 泛型约束(生产场景推荐)
更严谨的方式是约束T必须是IApiResponse的子类型,确保返回的错误对象结构匹配:async function transformRequest<T extends IApiResponse<any>>(data: T): Promise<T> { return { ...data, // 保留原数据结构,覆盖error字段 error: { status: 404, name: 'NotFound', message: 'Not Found', } }; }
2. 动态类型的应用
makeRequest函数已经通过泛型<T>实现了动态类型支持——调用时传入不同的类型参数(比如IUserData、IRoleData),就能让函数返回对应类型的结果,这就是TypeScript中动态类型的典型用法。
比如你的调用代码:
const user = await makeRequest<IUserData>('https://localhost/api/user/1'); const role = await makeRequest<IRoleData>('https://localhost/api/role/1');
这里IUserData和IRoleData就是动态传入的类型,TS会根据传入的类型参数自动推断返回值类型,完全满足查询用户、角色等多种数据场景的需求。
内容的提问来源于stack exchange,提问作者Петр Петров
相关产品推荐
相关产品推荐

