是否可以在打字稿中定义Float32Array类型的大小?

问题描述 投票:0回答:2

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

也可以用 float32arrays 来完成吗?

我尝试了

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

let foo: [number, number, number, number];
foo = new Float32Array([1, 2, 3, 4]);

但他们不是。

将代码中的所有类型更改为“[数字,数字,数字,数字];” (在我的例子中,我需要一个 4 个浮点数组作为点坐标)是一种可能性,尽管我需要在代码中的很多地方进行更改。

但是,我想知道是否可能存在扩展 Float32Array 类型的“childtype”,其中数组元素的数量可以固定在类型中。

arrays typescript
2个回答
2
投票

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]);
等...)。


0
投票

你可以为它创建一个类型,比如

type four_digits = {
   a: number
   b: number
   c: number
   d: number
}
© www.soinside.com 2019 - 2024. All rights reserved.