[英]Is it possible to define the size of a Float32Array type in typescript?
我知道可以定义数组的元组大小。 不适用于 float32array ,但它本身就是一个类。
这也可以用 float32arrays 来完成吗?
我试过const foo: FloatArray32[4]
但这将类型直接转换为数字。 我还尝试检查类型是否兼容:
let foo: [number, number, number, number];
foo = new Float32Array([1, 2, 3, 4]);
但他们不是。
将代码中的所有类型更改为 '[number, number, number, number];' (在我的情况下,我需要一个点坐标的 4 个浮点数组)是一种可能性,尽管我需要在代码中的很多地方进行更改。
但是,我想知道是否可能存在扩展 Float32Array 类型的“childtype”,其中数组的元素数量可以在类型中固定。
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
更容易 - 输入 200 或其他内容)。 这与您的示例相关 - 没有任何内容被转换为数字。 数组对象是固定长度数字的视图 - 再次使用Int8Array
运行测试并尝试将 200 分配给单元格,然后读取单元格。
这是原始数据的视图。 如果您提取它并进行数学运算,您现在处于 JS 领域并使用 Numbers - 但是一旦您将内容分配回来,您最好确保数据适合。 您无法让 JS/TS 在您的控制台中向您显示类似float32
,但数组本身的每个单元格都具有精确的字节长度。
不幸的是,就我所知,将长度作为类型的一部分在类型系统中并不重要,因为长度是在构造中确定的属性(即使是静态和只读的),而不是类型的一部分。 如果您确实想要这样的东西,那么薄包装就可以解决问题:
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]);
等等...)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.