Javascript 如何在typescript中键入固定长度生成器?
我在下面的typescript中有一个Vector2类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); 常数
//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]一样未知)
问题:
我不知道这里的生成器函数是否是正确的抽象。通常情况下,您会使用一个项目的长度是可变的或未知的 为什么不使用这样的实现:
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方法。我只是想用一种更简洁、更优雅的方式来实现我上面描述的。也许我会写一篇关于它的文章。