如何让TypeScript自动推断Window.setTimeout的参数类型?
实现
setTimeout自动推断参数类型的方案 你可以通过函数重载重新定义setTimeout,让TypeScript自动根据传入的handler推断后续参数的类型,无需显式指定泛型:
declare global { interface Window { // 优先匹配函数类型的handler,自动推断参数类型 setTimeout<TArgs extends any[]>( handler: (...args: TArgs) => void, timeout?: number, ...arguments: TArgs ): number; // 兼容原有TimerHandler类型(如字符串形式的handler,不推荐使用) setTimeout( handler: TimerHandler, timeout?: number, ...arguments: any[] ): number; } }
为什么你的原有写法需要显式指定泛型?
你原来的泛型定义THandler extends (...args: any[]) => any,TypeScript无法自动触发泛型推断——因为原有lib.d.ts中的setTimeout定义优先级更高,且泛型参数绑定到handler的整体类型时,TS不会主动推导这个泛型,必须显式传入才能生效。
而上面的重载写法,把泛型绑定到handler的参数数组上,当你传入具体的函数时,TS会自动匹配第一个重载,从handler的参数列表里推断出TArgs的类型,进而约束后续arguments的类型。
测试验证
用你的示例代码测试:
declare function doSomething(value: number): number; setTimeout( doSomething, 100, 'john', // 编译器会直接报错:类型"string"的参数不能赋给类型"number"的参数 );
此时无需显式指定泛型,编译器就能自动检查出参数类型不匹配的问题,符合预期。
内容的提问来源于stack exchange,提问作者bingles
相关产品推荐
相关产品推荐

