【发布时间】:2019-08-04 21:54:38
【问题描述】:
在 Haskell 中,我们可以声明允许我们隐藏对底层数据类型的访问的新类型。这允许我们通过不暴露诸如底层数组之类的东西在模块中创建更安全的 API(使库的用户不可能越界)。
Typescript 中有没有类似于 newtypes 的东西?
【问题讨论】:
-
你可以使用这个github.com/gcanti/newtype-ts
标签: typescript haskell types
在 Haskell 中,我们可以声明允许我们隐藏对底层数据类型的访问的新类型。这允许我们通过不暴露诸如底层数组之类的东西在模块中创建更安全的 API(使库的用户不可能越界)。
Typescript 中有没有类似于 newtypes 的东西?
【问题讨论】:
标签: typescript haskell types
作为对此的跟进,还有另一种方法可以引入类似于 newtypes 的东西。
您可以执行以下操作:
type Seed = number & {readonly Seed: unique symbol}
const createSeed = randomNumberBetween0And1() as Seed
const doSomethingWithSeed = (s: Seed) => {...}
doSomethingWithSeed(1) // will complain
doSomethingWithSeed(createSeed()) // Will not complain
【讨论】:
FWIW 一个具有单个私有字段的类或多或少是相同的,所以它不像关键字是严格需要的。
还要注意,Haskell 中的newtype 并不是真正的封装,尽管您可以这样使用它——它是为了使相同的结构表示具有不同的类型,防止意外误用并允许基于类型的广告通过类型类的 hoc 多态性。 Haskell 的 data 工作方式几乎相同,除了实现细节之外,newtype A = A X 和 data A = A X 之间的区别更多的是哲学而非技术。
【讨论】: