如何为函数参数指定类型,同时让返回类型自动推断?
问题解答
1. 自动推断返回类型的方式名称
你提到的这种自动推导函数返回类型的方式叫做类型推断(Type Inference)。TypeScript会通过分析函数体内的返回逻辑,自动推导出函数的返回类型,无需开发者显式声明。
2. 仅约束参数类型、保留返回类型自动推断的实现方法
要实现只对函数参数指定类型,同时让TypeScript自动推断返回类型的需求,推荐以下两种方案:
方案一:使用satisfies关键字(TypeScript 4.9及以上版本)
satisfies关键字的作用是确保值符合指定的类型约束,但不会覆盖TypeScript对值本身的类型推断。你可以先定义一个仅约束参数的函数类型,再用satisfies约束函数实现:
// 定义仅约束参数的函数类型,返回类型用unknown占位 type ExampleFunction = (greeting: string | boolean) => unknown; // 使用satisfies约束函数符合ExampleFunction,同时保留返回类型推断 const helloWorld = ((greeting) => { if (typeof greeting === 'boolean') return greeting; return `hello ${greeting}`; }) satisfies ExampleFunction; type x = ReturnType<typeof helloWorld>; // ^? type x = string | boolean
方案二:单独定义参数类型(兼容所有TypeScript版本)
如果你的TypeScript版本低于4.9,可以先单独提取参数类型,再在函数参数上使用该类型约束,这样返回类型依然会被自动推断:
// 单独定义参数类型 type GreetingParam = string | boolean; // 在函数参数上使用该类型约束 const helloWorld = (greeting: GreetingParam) => { if (typeof greeting === 'boolean') return greeting; return `hello ${greeting}`; }; type x = ReturnType<typeof helloWorld>; // ^? type x = string | boolean
原写法返回any的原因
你之前的写法中,直接将helloWorld标注为ExampleFunction类型,而该类型的返回值被显式指定为any。TypeScript会优先使用开发者显式声明的类型,因此会忽略函数体的自动推断结果,最终返回any类型。
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

