如何不使用any定义任意函数类型?TypeScript合规方案问询
替代
any的任意函数类型方案 下面是两种符合no-explicit-any规则、且能接收所有函数类型的替代方案:
1. 使用内置Function类型(最简洁)
TypeScript内置的Function类型是所有函数的顶层超类型,任何函数都可以赋值给它,完全规避显式any:
type AnyFunction = Function;
注意:
Function的调用签名比较宽松——调用时允许传入任意参数,返回值为any。如果只是用来标记“这是一个函数”而不需要调用,这是最优选择;若需要调用,建议对返回值做类型断言或收窄处理。
2. 泛型+unknown约束(更安全)
如果希望保留返回值的unknown类型(比any更安全),可以用泛型定义兼容所有函数的类型:
type SafeAnyFunction<TArgs extends readonly unknown[] = readonly unknown[], TReturn = unknown> = (...args: TArgs) => TReturn;
使用示例:
function handleFunction(fn: SafeAnyFunction) { const result = fn(); // result类型为unknown,需显式收窄后使用 if (typeof result === 'string') { console.log(result.toUpperCase()); } } // 可传入任意参数和返回值的函数 handleFunction((id: number, active: boolean) => ({ id, active })); handleFunction(() => new Date());
这种方案通过泛型的兼容性覆盖所有函数类型,既符合lint规则,又能在调用时保持类型安全。
内容的提问来源于stack exchange,提问作者Islingre
相关产品推荐
相关产品推荐

