arrays - 是否可以在打字稿中定义 Float32Array 类型的大小?
问题描述
我知道使用元组可以定义数组的大小。但不适用于作为类本身的 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 或其他内容)。这与您的示例相关 - 没有任何内容被转换为数字。数组对象是固定长度数字的视图 - 再次,使用 an 运行测试Int8Array
并尝试将 200 分配给单元格,然后读取单元格。
这是对原始数据的看法。如果您提取它并进行数学运算,那么您现在处于 JS 领域并使用数字- 但是一旦您将东西分配回来,您最好确保数据适合。您无法让 JS/TSfloat32
在控制台中向您显示类似的内容,但数组本身的每个单元格都具有精确的字节长度。
不幸的是,据我所知,使长度成为类型的一部分在类型系统中并非易事,因为长度是在构造中确定的属性(即使是静态的和只读的),而不是类型的一部分。如果你确实想要这样的东西,一个薄的包装器可以做到这一点:
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]);
等等)的情况下。
推荐阅读
- arm64 - aarch64 在 EL3 中从 EL1 执行 IRQ
- scheme - 为什么 cons 根据 S 表达式的位置给出不同的值
- html - 如何修复屏幕右侧的 div 按钮?
- c - 在 getchar() 之后使用 fgets()
- ios - 在 Swift 中获取 Base64 编码的 SHA12 MD5 摘要
- excel - R1C1中不同工作表的VBA最后一行和列
- swt - swt 子外壳,按钮选择有一个 for 循环,执行时间超过 5 秒。SWT GUI 冻结 5 秒后无响应
- rust - 对于文件列表,如何仅为已更改的文件运行构建脚本?
- javascript - 如何将我的 firebase 实时数据库功能转换为 firestore 功能
- python - 如何从另一个目录级别检索文件?