我知道使用tuples可以定义数组的大小。但不适用于float32array,因为它本身就是一个类。
这也可以用float32arrays实现吗?
我尝试过const foo: FloatArray32[4],但这会将类型直接转换为数字。我还试着检查类型是否兼容:
let foo: [number, number, number, number];
foo = new Float32Array([1, 2, 3, 4]);但事实并非如此。
可以将代码中的所有类型更改为“number,number;”(在我的示例中,我需要一个4浮点数组作为点坐标),尽管我需要在代码中的许多地方进行更改。
然而,我想知道是否有一个‘子类型’扩展Float32Array类型,其中数组的元素的数量可以在类型中固定。
发布于 2020-11-23 05:13:22
事实上,Javascript类型的数组是固定长度的-请参阅example的文档。特别是构造函数:
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,使长度成为类型系统的一部分在类型系统中不是微不足道的,因为长度是在构造中确定的属性(即使是静态的和只读的),而不是类型的一部分。如果你真的想要这样的东西,一个薄薄的包装器就可以做到:
class vec4 extends Float32Array {
constructor(initial_values? : [number, number, number, number]) {
initial_values? super(initial_values) : super(4);
}
}就能达到目的。如果您愿意放弃方括号,您可以在不同的方法中添加索引越界检查(您可以在固定宽度的数组中设置任何单元格,但它不会做任何事情,如果超出界限,检索它将产生undefined,这可能容易出错):
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]);等)的情况下才能实现。
https://stackoverflow.com/questions/64959421
复制相似问题