我正在努力升级一些旧的TypeScript代码以使用最新的编译器版本,而我在调用时遇到问题setTimeout.代码期望调用浏览器的setTimeout函数返回一个数字:
setTimeout(handler: (...args: any[]) => void, timeout: number): number;
但是,编译器正在将此解析为节点实现,它返回NodeJS.Timer:
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer;
此代码不在节点中运行,但节点类型作为对其他内容的依赖(不确定是什么)而被拉入.
如何指示编译器选择setTimeout我想要的版本?
这是有问题的代码:
let n: number;
n = setTimeout(function () { /* snip */ }, 500);
Run Code Online (Sandbox Code Playgroud)
这会产生编译器错误:
TS2322:类型'定时器'不能分配给'数字'类型.
处理定时器时正确的类型是什么?我曾尝试Timeout和number
let debounceResize: any;
// ^ What should this be?
window.addEventListener('resize', () => {
clearTimeout(debounceResize);
debounceResize = setTimeout(calcCanvasSize, 500);
});
Run Code Online (Sandbox Code Playgroud)
我有一个名为的组件InputAutocomplete,当单击它时,使用ModalController来打开一个模态。该模型使用自定义组件PageAutocompleteComponent作为其模板。
我的问题是,当我单击InputAutocomplete按钮时,有时会显示模态,有时则不会。
我一直很犹豫要不要在 Stack Overflow 寻求帮助,因为我很难解释问题是什么(因为我也很难可靠地复制问题)。
此外,当发生此错误时,我的模拟器不再随代码更改而刷新。使用打开警报AlertController也不再有效。
Ionic:
Ionic CLI : 5.4.15 (F:\Program Files\nodejs\node_modules\ionic)
Ionic Framework : @ionic/angular 4.11.5
@angular-devkit/build-angular : 0.801.3
@angular-devkit/schematics : 8.1.3
@angular/cli : 8.1.3
@ionic/angular-toolkit : 2.0.0
Cordova:
Cordova CLI : 9.0.0 (cordova-lib@9.0.1)
Cordova Platforms : android 8.1.0, browser 5.0.4
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 4.1.3, (and 20 other plugins)
Utility:
cordova-res (update available: 0.9.0) : 0.8.1
native-run (update available: …Run Code Online (Sandbox Code Playgroud)