gpt4 book ai didi

typescript - 真正的setTimeout类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:01 25 4
gpt4 key购买 nike

考虑以下代码:

<script> var x = { setTimeout: setTimeout };                            </script>
<script> x.setTimeout(function () { console.log(1) }); // TypeError </script>
<script> (0,x.setTimeout)(function () { console.log(2) }); // Ok </script>

使用 this 调用 setTimeout 而不是 nullundefinedwindow崩溃

Uncaught TypeError: Illegal invocation

现在我正在用 typescript 编写类似的代码,但我得到了截然不同的结果:

function f() { }

var x = { setTimeout };
x.setTimeout(f); // Fine for TS
(0, x.setTimeout)(f); // Left side of comma operator is unused and has no side effects.

还有一些问题:

  1. TS 使用奇怪的 this 推断类型。
  2. 0 有副作用 - 它会在函数调用中更改 this
    Solved通过 0 as any 而不是 0
  3. 我有 tried显式声明 this 的几种方法,但没有一种方法同时使第一次调用无效和第二次有效(甚至只有副作用错误)。

是否可以声明函数签名以便它只能在全局或无效上下文中执行?

最佳答案

您可以使用 this 参数重新声明 setTimeout 签名:

declare function setTimeout(this: Window | void, handler: (...args: any[]) => void, timeout: number): number;
declare function setTimeout(this: Window | void, handler: any, timeout?: any, ...args: any[]): number;

var x = { setTimeout: setTimeout };
x.setTimeout(function () { console.log(1) }); // error: x is not window
setTimeout(function () { console.log(1) }); // ok

关于typescript - 真正的setTimeout类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com