type NewType = string * int
就是所谓的类型缩写。它为另一种类型提供名称或别名,但在编译过程中会被删除。没有封装,没有新的引用,也基本没有新的类型。
它可以用作文档,但 F# 的编译器将新名称和别名类型视为相同。如果您使用正在使用的公共函数/方法创建 DLLNewType
并尝试从另一个项目中调用它,则这一点尤其明显 - 您将看到与您的情况类似的混合结果。
如果您想要实现的只是更好的可读性,这可能不是问题。如果我let testFunction (arg1:NewType) : NewType = ...
在代码中看到,尤其是在 GitHub 等网络上,没有 IntelliSense 工具提示,这仍然让我很好地了解函数接受和返回的内容,即使实践中的“真实”类型是string * int
.
如果您想要更好的类型安全性,通常的做法是定义一个单例区分联合,您可以将其与模式匹配结合起来,如下所示:
type NewType = NewType of (string * int)
let testFunction (NewType arg1): NewType =
NewType ("resultString", 2)
testFunction (NewType ("test", 3))
您可以在此处以及该系列的其他文章中阅读更多内容:https ://fsharpforfunandprofit.com/posts/type-abbreviations/