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

如何让类型别名的泛型可选且保留函数组合的类型约束?

问题1:让FunctionComposition泛型可选并保留类型约束

你原来的类型别名要求必须显式指定IntermediateType,可以通过两种方式解决:

方式1:给泛型设置默认类型

直接给泛型参数设置默认值,不指定时会使用默认类型,同时保留f输出与g输入的约束:

type FunctionComposition<IntermediateType = unknown> = {
  f: (a: any) => IntermediateType;
  g: (b: IntermediateType) => any;
};

// 不指定泛型,默认用unknown
const comp1: FunctionComposition = {
  f: (a) => 123,
  g: (b) => b.toFixed() // 此处b为unknown,会提示类型错误(unknown没有toFixed方法)
};

// 指定泛型,获得正确约束
const comp2: FunctionComposition<number> = {
  f: (a) => 123,
  g: (b) => b.toFixed() // 正常,b为number类型
};

方式2:用辅助函数自动推断泛型

如果希望TypeScript自动推导中间类型,无需手动指定泛型,可以写一个辅助函数创建符合约束的对象:

function createComposition<IntermediateType>(
  composition: {
    f: (a: any) => IntermediateType;
    g: (b: IntermediateType) => any;
  }
) {
  return composition;
}

// 使用时自动推断中间类型
const comp = createComposition({
  f: (a) => a.toString(), // 返回string,自动推断IntermediateType为string
  g: (b) => b.length // b自动被推断为string,可正常访问length属性
});

问题2:让Step类型自动推断Output泛型

直接定义Step类型时需要显式指定Output,但可以通过辅助函数让TypeScript自动根据boot的返回值推断Output类型,同时保证terminate的参数与boot的输出类型匹配:

保留你的Step类型定义:

type Step<Output> = {
  boot: (input: any) => Output;
  terminate: (output: Output) => any;
};

编写辅助函数创建Step实例:

function createStep<Output>(step: Step<Output>) {
  return step;
}

// 使用示例:自动推断Output类型
const dbStep = createStep({
  boot: () => ({ connection: 'db-connection-123' }), // 返回{ connection: string },自动推断Output为此类型
  terminate: (output) => {
    console.log('Closing database connection:', output.connection); // output类型自动匹配,可正常访问connection
  }
});

const output = dbStep.boot();
dbStep.terminate(output); // 类型匹配,无错误
// dbStep.terminate('invalid-output'); // 类型不匹配,TypeScript会报错

这种方式下,你不需要手动指定Output泛型,TypeScript会自动完成推断,并且在terminate传入不匹配类型时及时报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:25:19