Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在typescript中键入固定长度生成器?_Javascript_Typescript_Generator - Fatal编程技术网

Javascript 如何在typescript中键入固定长度生成器?

Javascript 如何在typescript中键入固定长度生成器?,javascript,typescript,generator,Javascript,Typescript,Generator,我在下面的typescript中有一个Vector2类 //Vector2.ts 类向量2{ 构造函数(公共x、公共y){ 这个.x=x; 这个。y=y; } //…一堆向量方法 public*[Symbol.iterator]:生成器{ 产生这个.x; 产生这个.y; } } //main.js const canvas=document.querySelector(“#canvas”); const ctx=canvas.getContext('2d'); 常数a=新向量2(0,0); 常数

我在下面的typescript中有一个Vector2类

//Vector2.ts
类向量2{
构造函数(公共x、公共y){
这个.x=x;
这个。y=y;
}
//…一堆向量方法
public*[Symbol.iterator]:生成器{
产生这个.x;
产生这个.y;
}
}
//main.js
const canvas=document.querySelector(“#canvas”);
const ctx=canvas.getContext('2d');
常数a=新向量2(0,0);
常数b=新向量2(10,10);
ctx.beginPath();
ctx.moveTo(…a);
//正常工作,但有此警告:
//应为2个参数,但得到0个或更多。ts(2556)
ctx.lineTo(…b);
ctx.stroke();
ctx.closePath();
根据我的设计,这段代码工作得非常好。然而,typescript似乎不知道提供了多少个参数,并不断警告我;除非我直接将其转换为2个数字的元组,如下所示:

class Vector2 {
  public toArray(): [number, number] {
    return [this.x, this.x];
  }
}

ctx.moveTo(...myVector.toArray());
ctx.moveTo(…(与[number,number]一样未知)

问题:

  • 当我使用扩展运算符时,是否有办法告诉typescript我的Vector2实例将被解构成一个固定长度的元组
  • 有没有办法用固定长度的发电机

  • 我不知道这里的生成器函数是否是正确的抽象。通常情况下,您会使用一个项目的长度是可变的或未知的

    为什么不使用这样的实现:

    class Vector2 {
      public toArray(): [number, number] {
        return [this.x, this.x];
      }
    }
    
    ctx.moveTo(...myVector.toArray());
    

    通过这种方式,TypeScript编译器知道
    toArray
    返回的类型,并且知道它在应用于
    ctx.moveTo

    时是有效的。我真诚地怀疑您是否能够做到这一点,因为当您依赖于类似迭代器的类型时,即使元组本身也会失去元组的属性。我还没有找到任何明确的说法,说这是不可能的,尽管(我有点希望看到GitHub的一些问题,但它还没有被淘出来)我打开了一个关于这个特性的问题,如果您仍然感兴趣,请继续并在下面留下评论:))这很有趣,但我不知道这里列出的用例是否会被认为是引人注目的。。。与一次返回一个元组相比,这种做法有多普遍?您描述的生成器是一个类型以非收缩方式发生变异的生成器(例如,从其
    next()
    返回
    {done:false}
    的对象到其
    next()
    返回
    {done:true}
    )的对象,并且该类型的变异在类型系统中的任何其他地方都不受支持。。这意味着,除非有压倒性的需求,否则我希望它会被拒绝。实际上,在我尝试生成器实现lol之前,我已经实现了这个toArray方法。我只是想用一种更简洁、更优雅的方式来实现我上面描述的。也许我会写一篇关于它的文章。