Rust 结构体的 TypeScript 等价物是什么?

mat*_*rai 1 rust typescript

我已经用 TypeScript 编写了大约一年左右的时间,并且我在 Github 上发现了一个用 Rust 编写的不错的项目,我想将其包装在 TypeScript 中。我从未用 Rust 编程,但我有 C++ 经验。我相信标题中我的问题已经很清楚了。Rust 中的结构有点像 TypeScript 中的接口吗?

cdh*_*wie 7

Rust 中的结构有点像 TypeScript 中的接口吗?

有点像,但是没有。

TypeScript 接口声明了对象必须具有哪些成员才能满足接口的要求,但对象可以拥有更多成员。一个 JavaScript 对象可以满足形状截然不同的多个TypeScript 接口,只需同时拥有这些接口所需的所有内容即可。

在 Rust 中,结构体是复合类型的定义。该类型的每个值都具有结构定义中声明的成员——不多也不少。

如果说 TypeScript 接口就像 Rust特征,会是一个更好的类比。 两者都声明了满足接口/特征所需的一组必需的“东西”,并且可以在同一结构上实现多个特征。然而,这仍然不是 100% 准确的类比,因为特征不能声明字段(数据成员/属性),只能声明函数、常量和类型。

另请注意,TypeScript 接口是结构性的,而不是名义上的。这意味着两个具有完全相同结构的 TypeScript 接口尽管名称不同,但可以有效地互换;您可以隐式地将变量从一个这样的接口“转换”到另一个接口,并且不需要进行强制转换。在 Rust 中,具有相同声明字段的两个结构不能这种方式互换,这也不适用于具有相同内容的特征。(如果确实如此,像 、 、 等标记特征CopySend不可能Sync存在,因为它们将在每种类型上隐式实现!)

Rust 结构体的 TypeScript 等价物是什么?

确实没有一个好的等价物。结构体定义了值具有哪些字段,但在 JavaScript/TypeScript 中,对象没有不可变的形状——它们总是可以随时用新的东西进行扩展(冻结/密封时除外),因此 JavaScript 不需要这个概念“结构”本身。动态类型语言通常不需要字段声明;这是您通常只会在静态类型语言中看到的情况。

TypeScript 为 JavaScript 的活力带来了一定量的静态类型,但即使在 TypeScript 中,这种活力仍然存在。TypeScript 与其说是“静态类型的 JavaScript”,不如说是“带有一些类型检查的 JavaScript”。