gpt4 book ai didi

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

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

尝试整合 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/

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