相关疑难解决方法(0)

“TS2322:运行单元测试时,类型 'Timeout' 不可分配给类型 'number'”

我有两个 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调用。

unit-testing typescript karma-runner karma-mocha

46
推荐指数
4
解决办法
2万
查看次数

在Ionic 2中使用NodeJS.Timer时找不到命名空间NodeJS

我试图将我在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)

ionic-framework ionic2 angular

18
推荐指数
2
解决办法
7260
查看次数

TypeScript中的setTimeout应该使用什么返回类型?

考虑以下代码:

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声明即可完成工作?

typescript

18
推荐指数
3
解决办法
6773
查看次数

在webpack升级后找不到命名空间NodeJS

我有使用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 …

typescript webpack angular

12
推荐指数
2
解决办法
9240
查看次数

打字稿:超时的正确类型是什么?

处理定时器时正确的类型是什么?我曾尝试Timeout和number

  let debounceResize: any;
//                     ^ What should this be?
  window.addEventListener('resize', () => {
    clearTimeout(debounceResize);
    debounceResize = setTimeout(calcCanvasSize, 500);
  });
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

typescript reactjs

8
推荐指数
2
解决办法
5614
查看次数

角度点击去抖动

在我的模板中,我有一个字段和两个按钮:

<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 秒。怎么做?

rxjs typescript debounce angular

7
推荐指数
2
解决办法
1万
查看次数

在 ServiceWorker 中使用 setTimeout

在我的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在服务工作者中使用的正确方法是什么?

javascript service-worker progressive-web-apps

3
推荐指数
1
解决办法
1192
查看次数

应该在打字稿中定义什么类型的超时

我正在尝试在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)

javascript typescript ecmascript-6

2
推荐指数
1
解决办法
935
查看次数