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

TypeScript如何正确定义带可选参数的函数类型?

解决方案:用条件类型区分参数必填/可选

可以通过条件类型实现需求:当泛型参数使用默认的null时,函数不需要参数;当传入具体类型时,参数为必填项。

type MyFunctionType<T = null> = T extends null 
  ? () => unknown 
  : (options: T) => unknown;

// 传入具体类型,参数必填
const func1: MyFunctionType<{ option1: number }> = (options) => options.option1;
// 使用默认泛型,无参数
const func2: MyFunctionType = () => 'test';

console.log(func1({option1: 12})); // ✅ 正常运行
console.log(func2()); // ✅ 正常运行

console.log(func1()); // ❌ 报错:Expected 1 argument
console.log(func2({option1: 12})); // ❌ 报错:Expected 0 arguments

原理说明

  • 条件类型T extends null ? ... : ...会根据泛型T的实际类型分支处理:
    • 当T是默认的null时,函数类型被解析为无参数的() => unknown;
    • 当T传入具体的对象类型(比如{ option1: number }),函数类型被解析为必填参数的(options: T) => unknown。

这样既满足了默认情况下函数可以无参调用,又保证了传入具体类型时参数必须被传递,完美解决你遇到的两种写法的缺陷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:24:43