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

如何让TypeScript自动更新接口中回调参数为可选函数返回类型?

如何声明关联dataFormat返回值与render参数类型的Column接口

要实现你需要的类型关联(当存在dataFormat时,render的参数自动匹配其返回值类型),可以通过联合类型区分不同使用场景,让TypeScript自动推断对应类型:

interface A { /* 你的A接口定义 */ }

type Column<T> = 
  // 场景1:仅使用render,参数为原始数据类型T
  { render: (data: T) => void; dataFormat?: never }
  // 场景2:同时使用dataFormat和render,render参数自动匹配dataFormat的返回值
  | { dataFormat: (rawData: T) => infer U; render: (formatedData: U) => void };

// 测试用例1:仅render,参数类型为A
const c1: Column<A> = {
  render(data) {
    // data: A
  }
};

// 测试用例2:同时使用dataFormat和render,render参数自动推断为{ a: number }
const c2: Column<A> = {
  dataFormat(rawData) {
    // rawData: A
    return { a: 1 };
  },
  render(formatedData) {
    // formatedData: { a: number }
  }
};

说明:

  • 联合类型第一个分支对应仅使用render的场景,dataFormat被标记为never,意味着不能传入该属性,符合可选且不冲突的要求。
  • 第二个分支通过infer U自动提取dataFormat的返回值类型,让render的参数类型与之绑定,无需手动指定泛型。
  • 如果需要支持仅使用dataFormat的场景,可以添加第三个分支:{ dataFormat: (rawData: T) => void; render?: never }

另外,如果你希望更灵活的泛型声明(允许手动指定格式化后类型),也可以使用双泛型接口:

interface Column<T, U = T> {
  dataFormat?: (rawData: T) => U;
  render: (data: U) => void;
}

// 仅render,U默认为A
const c1: Column<A> = {
  render(data) { /* data: A */ }
};

// 手动指定格式化后类型,TS会校验dataFormat的返回值是否匹配
const c2: Column<A, { a: number }> = {
  dataFormat(rawData) { return { a: 1 }; },
  render(formatedData) { /* formatedData: { a: number } */ }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:15:06