如何为TypeScript泛型函数添加默认值?解决类型匹配报错
泛型函数默认值类型报错的解决方法
你写的这段泛型函数:
const run = <T extends Record<any, any>>(arg?: T = {}) => {}
出现的报错本质是TypeScript的类型安全检查:T可以是Record<any, any>的任意子类型(比如{name: string}),但空对象{}并不一定符合所有子类型的结构,所以TS不允许直接将{}赋值给类型为T的参数。
要满足「可接收任意对象,不传则用空对象」的需求,有几种靠谱的解决方式:
方式一:给泛型参数设置默认类型
给T指定默认类型为{},同时用空值合并运算符兜底实际参数:
const run = <T extends Record<any, any> = {}>(arg?: T) => { const actualArg = arg ?? {}; // 后续逻辑用actualArg };
这种方式既保留了泛型的类型推导能力(传入具体对象时能正确推断T的类型),又保证了不传参数时使用空对象,完全符合需求。
方式二:简化类型定义(不需要保留参数类型时)
如果不需要在函数内部保留传入参数的具体类型信息,直接去掉泛型,用Record<any, any>定义参数即可:
const run = (arg: Record<any, any> = {}) => { // 逻辑代码 };
这种写法更简洁,适合不需要利用泛型做类型约束或推导的场景。
方式三:类型断言(谨慎使用)
如果必须保留泛型且要直接给参数设默认值,可以用类型断言绕过TS检查,但要注意潜在的类型风险(比如T包含必填属性时,空对象会不符合类型定义):
const run = <T extends Record<any, any>>(arg?: T = {} as T) => { // 逻辑代码 };
这种方式不推荐在严格类型检查的项目中使用,除非你能确保不会出现类型不匹配的运行时问题。
内容的提问来源于stack exchange,提问作者howard wolowitz
相关产品推荐
相关产品推荐

