我正在构建我的第一个开源JavaScript库作为节点模块,它解决了一个非常简单的问题,因此它是一个非常简单的模块,具体来说,它是一个单一的原型对象.
为了提供背景,我来自纯粹的网络技术背景,只有在过去的一年里,我才开始研究其他语言,爱上了静态类型,真正的OOP和面向类的语言,我开始看到营地两侧语言的利弊范围广泛.
据我所知,在构建一个面向类的类时,你应该return nil
指定构造失败,允许用户检查if(instance === nil)
它是否成功.或者我已经看到return 421
例如提供错误代码,然后我也假设一些也返回字符串等但重要的是,我已经看到你不应该抛出异常.
它是否正确?还有什么原因呢?对于面向原型的语言来说,这也是一个问题,或者javascript的动态特性是否可以接受?
这导致我的下一个问题,多年来我看到了很多javascript库,有一个修补程序和诸如此类的东西.我发现很少有人不仅要以OOP-ish模式构建原型,而且很少遇到任何经常实现的类型检测或类型检查,很多人都依赖于动态类型的便利来提供生产力提升,但我想通过动态类型开始混淆每种类型系统的优点和缺点,但也使用一些静态类型的模式和方法引入更稳定的架构.为了达到这一点,重要的是检查javascript脚本是否可以接受(甚至是好的?)做法?我想在我的原型构造函数和方法中添加严格的类型检查代码,但由于它是一个开源项目,我担心社区将如何处理它,他们是否希望它更加动态地输入?我只能假设很多人使用动态类型语言... ...动态打字,但值得深思.
免责声明
我了解 已经看到很多人说JavaScript是"类型化",而不是"动态"类型的,但使用动态纯粹是为了它的增殖.
TLDR-Q1:我可以在构造函数方法中抛出异常吗?在javascript原型中怎么样?为什么!?我应该怎么处理?
TLDR-Q2:我可以引入重型检查和抛出异常来为javascript脚本提供一个不好的静态类型吗?开发人员喜欢这样吗?我是无知的,这是一个非常普遍的事情?
TLDR-Q1:我可以在构造函数方法中抛出异常吗?在javascript原型中怎么样?为什么!?我应该怎么处理?
是的,您可以在构造函数中抛出异常.如果传递了真正无效的参数,那么这可能是最干净的方法.
我本人通常不会设计一个预期的代码路径来抛出异常,而是将其保留为可能表示错误数据或程序员错误使用的错误类型.在调试控制台中,异常会被很好地记录,并且是使用构造函数进行通信的最快方式之一,因为它会被记录,并且当你抛出时可以在错误对象中放置一条很好的描述性消息并且开发人员获得堆栈跟踪.
返回null
不是一种干净或有用的方式,并添加了开发人员通常不需要一直检查的代码null
.
TLDR-Q2:我可以引入重型检查和抛出异常来为javascript脚本提供一个不好的静态类型吗?开发人员喜欢这样吗?我是无知的,这是一个非常普遍的事情?
您可以根据需要编写Javascript类型检查.IMO,你应该只在你试图确定传入的参数是否有效时这样做.如果您需要一个字符串并且开发人员传入一个数字并且数字字符串是该函数的合理输入,那么我不明白为什么您不应该只是自动使用Javascript的字符串转换并放手.
Javascript开发人员喜欢键入检查,以帮助他们识别他们所犯的错误.Javascript开发人员不喜欢类型检查,当它只是迂腐,自动或显式类型转换可以正常工作.
还要记住,您应该很少坚持传递的对象是特定类型的对象(比如说使用instanceof
),因为传递任何像预期对象一样的对象应该是完全有效的.例如,promise
在Javascript中几乎可以是具有遵循正确规范的所需方法的任何对象.它不必是具有一个特定构造函数的特定类型的对象类.
Javascript不是一种强类型语言,并且没有理由试图让它表现得像它不是它.检查类型是否正确运行代码所需,而不是因为您试图使Javascript的行为与Java一样严格.我不建议添加类型检查只是因为您认为所有语言都应该进行类型检查.如果这是你的想法,那么也许你应该用TypeScript或类似的东西来编写,为类型添加类型规范.