我有两个 TypeScript 包,一个包(包 A)依赖于另一个(包 B)。每个包都有一个使用 Karma 设置的单元测试。从 NPM 安装所有依赖项后,当我为每个单独运行单元测试时,单元测试运行良好。但是,如果我npm link package-b在包 A 中使用并运行包 A 的单元测试,我会收到标题中所述的错误:“TS2322:类型‘超时’不可分配给‘数字’类型。”
有问题的线路是对 的调用setTimeout。挖后,我发现,虽然单独运行测试,没有npm link,打字稿正确识别setTimeout的签名typescript/lib/lib.dom为所需的类型,但在使用后出现故障的情况下,npm link它使用节点的使用setTimeout中的签名@types/node/index。我通过将返回类型更改setTimeout为string并string在Timeout.
我不确定的是为什么TypeScript 编译器决定在这种特定情况下使用替代定义,也不确定我如何说服它使用所需的定义。我很高兴发布一些代码,但我不确定在这种情况下什么有用,因为失败的线路上只有setTimeout调用。
我试图将我在https://github.com/bevacqua/dragula/issues/289#issuecomment-277143172上找到的代码用于我的Ionic项目.
当我运行代码时,我得到一个错误Cannot find namespace 'NodeJS',错误引用touchTimeout: NodeJS.Timer;
如何调整下面的代码以使NodeJS.Timer线路正常工作?
import { Directive, ElementRef, HostListener } from '@angular/core';
@Directive({ selector: '[delayDragLift]' })
export class DelayDragLiftDirective {
dragDelay: number = 200; // milliseconds
draggable: boolean = false;
touchTimeout: NodeJS.Timer;
@HostListener('touchmove', ['$event'])
// @HostListener('mousemove', ['$event'])
onMove(e: Event) {
if (!this.draggable) {
e.stopPropagation();
clearTimeout(this.touchTimeout);
}
}
@HostListener('touchstart', ['$event'])
// @HostListener('mousedown', ['$event'])
onDown(e: Event) {
this.touchTimeout = setTimeout(() => {
this.draggable = true;
}, this.dragDelay);
}
@HostListener('touchend', ['$event'])
// @HostListener('mouseup', …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
const timer: number = setTimeout(() => '', 1000);
Run Code Online (Sandbox Code Playgroud)
Typescript会抛出错误:Type 'Timer' is not assignable to type 'number'.快速查找告诉我setTimeout返回NodeJS.Timer.
但是,如果我正在进行基于浏览器的开发,使用NodeJS.Timer感觉不对.哪个是正确的类型定义或返回类型,setTimeout无需借助any声明即可完成工作?
我有使用WebPack构建的Angular2应用程序.我将WebPack从v1.8升级到v2,一切似乎都运行良好.唯一的问题是旧代码具有以下内容:
import Timer = NodeJS.Timer;
....
apptInterval: Timer;
....
this.apptInterval = setInterval(() => { ... }, 1000);
Run Code Online (Sandbox Code Playgroud)
升级后,这给了我一个错误: TS2503: Cannot find namespace 'NodeJS'.
tsconfig.json看起来像这样:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": ["es2015", "dom"],
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true
}
}
Run Code Online (Sandbox Code Playgroud)
Angular/Webpack的文档不再具有typings.json; 但是,即使我从Webpack 1目录中复制,它也无济于事.内容是typings.json是
{
"globalDependencies": {
"jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
"node": "registry:dt/node"
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我删除对NodeJS的引用,一切正常.像这样:
apptInterval: any;
....
this.apptInterval = setInterval(() => { ... }, 1000);
Run Code Online (Sandbox Code Playgroud)
如果我查看F12调试器,apptInterval的类型是ZoneTask.我确信有一种方法可以使它变得强大,但它逃脱了我.我发现的唯一建议是运行typings install dt~node …
处理定时器时正确的类型是什么?我曾尝试Timeout和number
let debounceResize: any;
// ^ What should this be?
window.addEventListener('resize', () => {
clearTimeout(debounceResize);
debounceResize = setTimeout(calcCanvasSize, 500);
});
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我有一个字段和两个按钮:
<div class="btn-plus" (click)="add(1)"> - </div>
<div class="txt"> {{ myValue }} </div>
<div class="btn-minus" (click)="add(-1)"> + </div>
Run Code Online (Sandbox Code Playgroud)
在我的组件 .ts 文件中,我有:
add(num) {
this.myValue +=num;
this.update(); // async function which will send PUT request
}
Run Code Online (Sandbox Code Playgroud)
该this.update()函数myValue在一个大的 JSON 对象中放入适当的字段并将其发送到服务器。
问题:当用户在短时间内点击加号/减号按钮 10 次时,请求将被发送 10 次。但我只想发送一次请求 - 最后一次点击后 0.5 秒。怎么做?
在我的ServiceWorker我有以下代码:
function send_alert() {
console.log('alert');
};
self.addEventListener('message', (evt) => {
console.log("message:" + evt.data);
self.setTimeout(1000*5, send_alert);
console.log("done");
});
Run Code Online (Sandbox Code Playgroud)
如果单击主页中的按钮,则会向工作人员发送一条消息。这工作正常,我在控制台中看到message: ...和done日志。该self.setTimeout调用不会引发错误,但从send_alert未被调用。
根据https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope实现的WindowTimers实现setTimeout。self应该是 的一个实例ServiceWorkerGlobalScope,所以我没有看到问题。setTimeout在服务工作者中使用的正确方法是什么?
我正在尝试在Typescript中编写一个反跳函数,但是不确定设置要分配给的变量的类型setTimeout。我的代码如下所示:
function debounced(func: () => void, wait: number) {
// what type should timeout be here?
let timeout: any;
return () => {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => {
func();
}, wait);
};
}
Run Code Online (Sandbox Code Playgroud) typescript ×6
angular ×3
javascript ×2
debounce ×1
ecmascript-6 ×1
ionic2 ×1
karma-mocha ×1
karma-runner ×1
reactjs ×1
rxjs ×1
unit-testing ×1
webpack ×1