如何让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
相关产品推荐
相关产品推荐

