typescript :数字的函数重载决议 |数组缓冲区

标签 typescript typescript-typings

尝试整合 WebGL2 typings在我们的项目中,我遇到了一个类型错误,我可以将其归结为以下 snippet :

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);
}

这会导致以下编译错误:

Argument of type 'number | ArrayBuffer' is not assignable to parameter of type 'ArrayBuffer'. Type 'number' is not assignable to type 'ArrayBuffer'.

据我所知,这应该是有效的代码,但我不完全确定我是否遇到了 TS 中的错误、错误的输入或者错误是否在我这边。有什么建议吗?

最佳答案

发生这种情况是因为 overloads do not resolve based on union types .两个重载都不匹配第二个参数的 number|ArrayBuffer 类型,并且编译器不理解这对重载可以合并。目前还没有立即解决这个问题的计划,尽管它被认为是一个痛点。

这意味着 bufferData() 的 WebGL2 类型并不完全不正确,但也不是很好。 TypeScript 手册“Do's and Don'ts”页面特别将此列为 "Don't" .由于签名仅在一个参数的类型上有所不同,因此最好使用联合类型,如下所示:

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

那么您的代码就不会抛出错误。代替将此定义返回上游,您可以通过 declaration merging 在本地将其添加到您自己的代码中。一切都会为您服务。

希望对您有所帮助;祝你好运!

关于 typescript :数字的函数重载决议 |数组缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47774478/

相关文章:

javascript - 静态删除对象键 JavaScript

typescript - 如何根据键将函数的参数键入为对象值

typescript - 如果参数是数组返回值数组否则返回值

jquery - 如何获取特定版本的 Jquery(例如 3.2.1)的 TypeScript 定义文件?

forms - Angular 2 RC.5 无法绑定(bind)到 'formGroup',因为它不是 'form' 的已知属性

javascript - Angular 2 不适合多页面应用程序吗?

typescript - 如何解压作为 Typescript 联合且可能是数组的返回类型?

typescript - 使用类似包的类型定义

typescript-typings - 如何修复节点类型的 tsc 抛出错误?

javascript - 将重新渲染限制为功能组件中的特定状态更改