如何让TypeScript根据可选参数返回不同类型值
解决方案
要实现根据dontCamelize选项动态推导返回类型,关键是优化条件类型判断逻辑,确保正确识别dontCamelize的状态。以下是修正后的代码:
type Decamelize<T> = { [K in keyof T as K extends string ? `${Uncapitalize<K>}` : K]: T[K] }; type Options = { dontCamelize?: boolean; verbose?: boolean; option1?: string; option2?: number; option3?: boolean; }; // 明确处理dontCamelize的不同状态 type ResponseType<T, O extends Options> = O['dontCamelize'] extends true ? Decamelize<T> : T; export function fetcher<T, O extends Options = {}>( subject: T, options?: O ): ResponseType<T, O> { // 模拟fetch返回值,实际场景替换为真实请求逻辑 let result = subject; if (options?.dontCamelize) { // 这里补充运行时decamelize转换逻辑(需自行实现) return result as unknown as Decamelize<T>; } return result as unknown as ResponseType<T, O>; } // 验证用例 const res1 = fetcher<{ fooBar: 'baz' }>({ fooBar: 'baz' }); // 类型:{ fooBar: 'baz' } ✅ const res2 = fetcher<{ fooBar: 'baz' }>({ fooBar: 'baz' }, { dontCamelize: true }); // 类型:{ foobar: 'baz' } ✅ const res3 = fetcher<{ fooBar: 'baz' }>({ fooBar: 'baz' }, { verbose: true }); // 类型:{ fooBar: 'baz' } ✅ const res4 = fetcher<{ fooBar: 'baz' }>({ fooBar: 'baz' }, { dontCamelize: true, verbose: true }); // 类型:{ foobar: 'baz' } ✅
关键修改说明
- 参数优化:将
options设为可选参数,移除原代码中= {} as O的类型断言,避免潜在类型冲突。 - 条件类型逻辑:原
ResponseType逻辑本身可行,核心是:当dontCamelize明确为true时返回Decamelize<T>,其余情况(未传、传false)返回原类型T。 - 运行时对齐:添加分支判断确保类型定义和实际运行行为一致,需补充具体的
decamelize转换函数实现。
内容的提问来源于stack exchange,提问作者robdodson
相关产品推荐
相关产品推荐

