2024 Clojure状态调查!中分享您的想法。

欢迎!请查阅关于页面了解如何使用本站的小贴士。

+2
Clojure

clojure以其简洁性、多线程模型、语言稳定性和优秀的Java互操作性,我非常喜欢它。但是,我对静态类型更感兴趣,这对于有多个开发者的项目来说非常有帮助。

TypeScript为JavaScript增加了极佳的类型检查层,可以帮助在编译时消除很多编程错误。它还打开了许多编辑器/IDE工具的可能性。我认为TypeScript是JavaScript发生过的最好事。

我在想,Clojure核心团队或其他具有强大能力和资源的组织,是否正在考虑为Clojure开发类似TypeScript的工具?

如果没有,为什么?

谢谢

1 个答案

+5

Clojure核心团队没有计划为Clojure实现静态类型,因为我们认为这不是必要的。我们的工作集中在spec(https://clojure.org/about/spec),它为描述Clojure数据和函数的可选规范提供支持。

Typed Clojure项目(https://typedclojure.org/)是Ambrose Bonnaire-Sergeant在攻读博士等期间进行的相当大的努力。您也许还对Spectrum(https://github.com/arohner/spectrum)感兴趣,它是基于spec的静态类型检查器。据我所知,这些都没有得到广泛的应用或特别活跃的开发。

非常有帮助。谢谢

编辑了
我认为这里有一个误解
"静态类型对于拥有多开发者的项目非常有帮助"
"Clojure 核心团队没有计划为 Clojure 开发静态类型,因为我们认为这没有必要。我们的努力集中在 spec (https://clojure.org/about/spec))

据我所知,请纠正我,发帖者要求“设计时类型”,而答案涉及Java所理解的静态类型。

我和,可能还有问题作者,正在寻找的是编写
 
(defn describe-dog [^:happy-puppy-co.api/dog dog]
      (println (str (:breed dog) (:age dog))))

并让智能提示获取  :happy-puppy-co.api/dog spec 并根据其键和相应的 subspecs 提供提示。即,帮助我按照作者意图使用 ::dog,而无需查看其文件。

TypeScript 在编译后不存在,它的输出是 JavaScript。TS 最大的好处是它帮助您更快地理解他人的代码(并在一定程度上帮助避免误用,但这是次要的)。
我不太清楚您的评论是否与原始问题一致,但如果您要求将规格集成到函数定义中,这是我们正在 spec 2 中考虑的事情。
那么,以下内容还有其他什么含义吗?

"我非常喜欢静态类型,这在项目涉及多人开发时非常有帮助。

TypeScript ... 也为编辑器 / IDE 工具提供了大量可能性。我认为 TypeScript 是 JavaScript 发展史上最伟大的事情。

在我看来,这意味着你必须不断地与大量代码打交道,这些代码既不是你写的,也不是你团队之前编写或审查过的。在大型企业应用程序中,通常会有数十个带有 30+ 个键的 DTO,命名非常不一致。典型的思维过程可能是:“好的,我们的函数将获得一个 'sales-deal' DTO,我需要将其转换为 'financing-deal' 并发送到数据分析,'sales-deal' 上的利润率属性叫什么?是 'margin'、'markup' 还是纯 'rate'?而且它已经是小数形式,还是销售交易仍然以列表化费率组件子 DTO 存在?” 然后,对 'financing-deal' 提出相同的疑问...

我完全同意“JavaScript 发展史上最伟大的事情”这一部分。遗憾的是,尝试 ClojureScript 似乎让人觉得重新回到了 JavaScript —— 这并不好。我赞赏 spec 的强大功能和它在运行时和测试中的帮助。我现在想做的事情是将所有这些功能都集成到我的 IDE 中,以帮助我编写代码。在我编写代码之前,没有代码可以运行或测试。
以下是我想要说明的内容的更好例子:请查看这个库:https://github.com/vriad/zod
它允许你定义类似于 spec 的模式,这些模式在设计和编译时也可以被 TypeScript 编译器理解和使用。

// spec 定义 - 在 TypeScript 编译之后仍然存在,可用于验证模式
const dogSchema = z.object({
  name: z.string(),
  neutered: z.boolean(),
});

// 运行时验证 schema
const cujo = dogSchema.parse({
  name: 'Cujo',
  neutered: true,
}); // 通过,返回 Dog

// TypeScript 类型定义 - 在 TypeScript 编译之后不再存在
type Dog = z.infer<typeof dogSchema>;
/*
等价于
type Dog = {
  name:string;
  neutered: boolean;
}
*/

// 使用推断的类型进行编译时类型检查和设计时智能感知
const fido: Dog = {
  name: 'Fido',
}; // TypeError: 缺少必须的属性 `neutered`
...