打字稿:数字的功能超载分辨率|ArrayBuffer



试图将WebGL2打字整合到我们的项目中时,我遇到了一个类型错误,我可以煮沸到以下片段:

interface WebGL2RenderingContext {
  bufferData(target: number, size: number, usage: number): void;
  bufferData(target: number, srcData: ArrayBuffer, usage: number): void;
}
function test(gl: WebGL2RenderingContext, sizeOrData: number|ArrayBuffer){
  gl.bufferData(0, sizeOrData, 0);
}

导致以下汇编错误:

类型'数字的参数|ArrayBuffer'不能分配给" ArrayBuffer"类型的参数。键入'number'不能分配给'arraybuffer'。

据我所知,这应该是有效的代码,但是我不确定我是否遇到了TS中的错误,不正确的打字,或者错误毕竟是否在我目的中。有建议吗?

发生这种情况,因为超载无法基于联合类型解决。过载都不匹配第二个参数的number|ArrayBuffer类型,并且编译器不知道可以合并这对过载。尽管它被认为是痛苦点,但没有立即解决此问题的计划。

这意味着bufferData()的WebGL2键入不是完全不正确的,但它们并不好。打字稿手册" Do and Nots"页面专门列出了它为"不"。由于签名仅因一个参数的类型而有所不同,因此最好使用联合类型,例如:

interface WebGL2RenderingContext {
  bufferData(target: number, sizeOrData: number | ArrayBuffer, usage: number): void;
}

那么您的代码不会丢失错误。代替在上游贡献此定义的贡献,您可以通过声明合并本地将其本地添加到自己的代码中,一切都会适合您。

希望有帮助;祝你好运!

最新更新