You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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' } ✅

关键修改说明

  1. 参数优化:将options设为可选参数,移除原代码中= {} as O的类型断言,避免潜在类型冲突。
  2. 条件类型逻辑:原ResponseType逻辑本身可行,核心是:当dontCamelize明确为true时返回Decamelize<T>,其余情况(未传、传false)返回原类型T。
  3. 运行时对齐:添加分支判断确保类型定义和实际运行行为一致,需补充具体的decamelize转换函数实现。

内容的提问来源于stack exchange,提问作者robdodson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:32:21