如何强制TypeScript中run函数的参数函数必须返回值?
强制函数参数必须返回值的TypeScript实现
你想要约束run函数的参数f必须正常返回任意值(排除返回never的情况,比如抛出错误、无限循环的函数),你的思路方向是对的,但!never并非TypeScript的合法语法,以下是两种正确的实现方式:
方法一:泛型条件类型(推荐)
通过泛型结合条件类型,直接拒绝返回never的函数:
const run = <T>(f: () => T extends never ? never : T) => f();
测试示例
- 合法调用(函数有正常返回值):
run(() => 123); // 正常通过类型检查 run(() => "test"); // 正常通过 run(() => undefined); // 正常通过,undefined属于合法返回值 - 非法调用(函数返回
never):// 抛出错误的函数,返回类型为never run(() => { throw new Error("error"); }); // TypeScript报错,无法传入 // 无限循环的函数,返回类型为never run(() => { while(true) {} }); // 同样报错
方法二:显式定义非never返回函数类型
如果不需要推导返回值的具体类型,可以直接定义一个排除never的函数类型:
type NonNeverReturnFn = () => Exclude<unknown, never>; const run = (f: NonNeverReturnFn) => f();
这种方式下,返回never的函数无法赋值给NonNeverReturnFn,会触发类型错误。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

