首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在typescript中定义Float32Array类型的大小?

是否可以在typescript中定义Float32Array类型的大小?
EN

Stack Overflow用户
提问于 2020-11-23 04:52:42
回答 1查看 234关注 0票数 0

我知道使用tuples可以定义数组的大小。但不适用于float32array,因为它本身就是一个类。

这也可以用float32arrays实现吗?

我尝试过const foo: FloatArray32[4],但这会将类型直接转换为数字。我还试着检查类型是否兼容:

代码语言:javascript
复制
let foo: [number, number, number, number];
foo = new Float32Array([1, 2, 3, 4]);

但事实并非如此。

可以将代码中的所有类型更改为“number,number;”(在我的示例中,我需要一个4浮点数组作为点坐标),尽管我需要在代码中的许多地方进行更改。

然而,我想知道是否有一个‘子类型’扩展Float32Array类型,其中数组的元素的数量可以在类型中固定。

EN

回答 1

Stack Overflow用户

发布于 2020-11-23 05:13:22

事实上,Javascript类型的数组是固定长度的-请参阅example的文档。特别是构造函数:

代码语言:javascript
复制
new Float32Array(); // new in ES2017 
new Float32Array(length);
new Float32Array(typedArray); 
new Float32Array(object); 
new Float32Array(buffer [, byteOffset [, length]]);

它们都具有在创建时可以推断的长度(新的第一个创建一个包含0个元素的空数组。我猜它简化了一些边缘情况)。

我不确定您是如何确定类型的,但是一旦您从数组中获得一个项,它就会被转换为一个数字,这是JS中唯一可用的数字类型-所以在这里查看您的日志会产生误导。看一下下面的静态属性:

Float32Array.prototype.byteLength

返回Float32Array的长度(字节)。已在构造时修复,因此为只读。

这是唯一重要的事情。如果你仍然不相信文档,试着在溢出单元格后记录它(使用int8 -put200或更容易)。这与您的示例相关-没有任何内容被转换为数字。数组对象是一个固定长度的视图-同样,使用Int8Array运行测试,并尝试将200赋给该单元格,然后读取该单元格。

这是一个原始数据的视图。如果你对它进行提取并进行数学运算,你现在就进入了JS领域,并且正在处理数字--但是一旦你重新分配了数据,你最好确保数据与之相符。您不能在控制台中使用 JS/TS向您显示类似float32的内容,但是数组中的每个单元格本身都有确切的字节长度。

unfortunately,使长度成为类型系统的一部分在类型系统中不是微不足道的,因为长度是在构造中确定的属性(即使是静态的和只读的),而不是类型的一部分。如果你真的想要这样的东西,一个薄薄的包装器就可以做到:

代码语言:javascript
复制
class vec4 extends Float32Array {
    constructor(initial_values? : [number, number, number, number]) {
    initial_values? super(initial_values) : super(4);
    }
}

就能达到目的。如果您愿意放弃方括号,您可以在不同的方法中添加索引越界检查(您可以在固定宽度的数组中设置任何单元格,但它不会做任何事情,如果超出界限,检索它将产生undefined,这可能容易出错):

代码语言:javascript
复制
get(index : number) {
    if(index > 4 || index < 0) ...
    return this.private_data[index];
}
set(index : number, value : number) {
    if(index > 4 || index < 0) ...
    this.private_data[index] = value;
}  

当然,在JS/TS中没有LSP,数组和你的类仍然是可以互换的,所以强制执行实际上只在构造时完成,而且只有在你不试图破坏你自己的代码(let foo : vec4; foo = new Float32Array([1, 2]);等)的情况下才能实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64959421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档