请分享您的看法,参加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,并基于其键及其相应的子spec提供提示。也就是说,帮助我像它的作者所期望的那样使用 ::dog,而无需查看其文件。

TypeScript在编译后不存在,它的输出是JavaScript。TS最大的好处是它帮助您更快地理解他人的代码(并提供一些避免误用的帮助,但这只是次要的)。
我对您评论是否与原始问题一致并不完全清楚,但如果您是在询问与函数定义集成的规格,那么这正是我们在第2版规范中考虑的。
by
那么下面的内容还可以如何诠释呢?

“我……是静态类型的粉丝,对于拥有多个开发者的项目来说,这非常有帮助。”

TypeScript...也开启了大量的编辑器/IDE工具的可能性。我认为,TypeScript是发生在JS上最好的事情。”

按照我的理解,这意味着您必须始终与大量之前既没有编写也没有审查过的代码一起工作。企业应用程序通常会有几十个具有30多个键的数据传输对象(DTO),其命名非常不一致。典型的思维方式可能是:“好吧,我们的函数将得到一个‘sales-deal’ DTO,我需要将其转换为‘financing-deal’并发送给分析,销售-deal中的利润率属性叫做什么?是‘margin’、‘markup’还是只是Plain‘rate’?它已经是小数形式了吗?还是销售-deal仍然将其作为itemized rate components sub-DTO的组成部分?”然后对‘financing-deal’也要提出相同的问题...

我衷心支持“发生在JS上的最佳事情”这一说法。遗憾的是,尝试ClojureScript感觉就像回到JS一样——并不是一个好事情。我欣赏spec的强大功能,及其在运行时和测试中的帮助。我现在想做的就是利用所有这些强大功能,将其插入到我的IDE中,以帮助我编写代码。如果没有编写代码,就没有可以运行或测试的。
by
顺便说一句,为了更好地说明我所寻找的内容,请查看以下库:https://github.com/vriad/zod
它让您能够定义类似于规格的模式,同时这些模式在设计和编译时也由TS编译器理解和使用。

// 规格定义 - 在TS编译之后存在,可以用来验证模式
const dogSchema = z.object({
  name: z.string(),
  neutered: z.boolean(),
});

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

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

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