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

如何让TypeScript在特定函数返回any时抛出错误?

检测函数返回值是否为any的代码方案

你可以通过自定义类型工具结合类型断言/辅助函数的方式,在代码中直接检测特定函数的返回值是否为any,无需修改全局编译器选项。

核心类型工具

先定义一个用来排除any的类型:

type NotAny<T> = T extends any ? (unknown extends T ? never : T) : T;

这个类型的逻辑是:

  • 如果T是any,unknown extends T会返回true(因为any兼容所有类型),此时返回never
  • 如果T是其他类型(包括unknown),则返回原类型T

用法1:辅助函数检查

写一个简单的辅助函数,用来包裹函数调用,自动检测返回值:

function assertNotAny<T>(value: NotAny<T>): T {
  return value;
}

// 测试示例
function getNumber(): number { return 0; }
assertNotAny(getNumber()); // ✅ 无错误,类型匹配

function getAny(): any { return 0; }
assertNotAny(getAny()); // ❌ 报错:类型'any'不能赋值给类型'never'

这种方式最直观,直接在需要检查的函数调用后加上assertNotAny()即可,后续代码回归时只要这个断言不报错,就说明返回值不是any。

用法2:直接类型断言

如果不想用辅助函数,也可以直接用类型断言检查函数的返回类型:

// 检查getNumber,无错误
getNumber() as NotAny<ReturnType<typeof getNumber>>;

// 检查getAny,报错
getAny() as NotAny<ReturnType<typeof getAny>>;

用法3:检查函数本身的返回类型

如果你想直接约束函数的定义(而非调用结果),可以用另一个类型工具:

type FunctionReturnsNotAny<F extends (...args: any[]) => any> = 
  ReturnType<F> extends any ? (unknown extends ReturnType<F> ? never : F) : F;

// 测试
const safeGetNumber: FunctionReturnsNotAny<typeof getNumber> = getNumber; // ✅ 正常
const safeGetAny: FunctionReturnsNotAny<typeof getAny> = getAny; // ❌ 报错:类型'() => any'不能赋值给类型'never'

适配隐式any场景

对于复杂泛型、索引类型导致的隐式推断any,这个方案同样有效。比如下面这个隐式返回any的函数:

function getImplicitAny(obj: { [key: string]: any }, key: string) {
  return obj[key]; // 隐式返回any
}

assertNotAny(getImplicitAny({ num: 123 }, 'num')); // ❌ 报错,检测到隐式any

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:38:28