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

如何让TypeScript中的泛型成为必填项?

如何定义必须显式传入泛型类型的函数

要实现调用函数时必须显式指定泛型类型,核心是让TypeScript无法从函数参数、返回值等上下文自动推断出泛型T的类型,强制调用者手动传入。

先修正你原示例的问题

你给出的示例定义存在两处问题:

  1. 参数解构里的d和默认值里的D大小写不一致
  2. 直接用T[]和T作为默认值的类型,同时默认值{}不匹配该类型,会导致TypeScript尝试自动推断T,无法达到强制传泛型的效果

正确的函数定义方式

方式1:不带默认参数的基础版

export const test = <T>(a?: string, options?: { c: T[], d: T }) => {
  // 这里写你的函数逻辑
};

这种写法下,因为没有任何能让TypeScript推断T的上下文信息,调用时必须显式指定泛型。

方式2:带默认参数的版本

如果需要给参数设置默认值,要避免默认值提供T的推断依据,可以用类型断言处理:

export const test = <T>(a: string = "", options: { c: T[], d: T } = {} as { c: T[], d: T }) => {
  // 这里写你的函数逻辑
};

调用示例

  • 合法调用(必须显式传泛型):
    test<string>() // 正常通过
    test<number>("demo", { c: [1, 2, 3], d: 4 }) // 正常通过
    
  • 非法调用(会报错):
    test() // 报错:无法推断泛型类型T
    test("demo") // 报错:无法推断泛型类型T
    

原理说明

当泛型T无法从函数的参数、返回值等上下文自动推导时,TypeScript会抛出类型错误,要求调用者显式指定泛型参数,以此实现“必须传入泛型类型”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:07:16