首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在打字稿中做标称类型的最有力的方法?

在打字稿中做标称类型的最有力的方法?
EN

Stack Overflow用户
提问于 2020-05-17 17:16:29
回答 1查看 456关注 0票数 1

我已经看到了许多不同的方式来做标称类型的打字,但它们似乎都在某种程度上是不够的。我希望所有这些财产都有:

  1. 必须有明确的编译器错误信息(不一定是简洁的,但如果是这样的话)编译器错误信息,沟通哪些不透明类型,例如Type 'GBP' is not assignable to type 'JPY'
  2. 必须是真正唯一的,以避免意外匹配类似的不透明类型,即没有__tag__键,必须使用unique symbol
  3. 必须能够具有使用不透明类型的安全泛型函数,共享相同的基础基元类型,例如<A>(Opaque<number, A>) => Opaque<number, A>

更多的加分,一个语法干净的界面,但我理解这是主观的。

EN

回答 1

Stack Overflow用户

发布于 2020-05-17 17:47:17

这是我发现的最好的方法:

代码语言:javascript
复制
namespace Unique {
  export declare const Newtype: unique symbol
  export declare const JPY: unique symbol
  export declare const GBP: unique symbol
}

type Newtype<A, B extends symbol> = A & { readonly [Unique.Newtype]: B }

type JPY = Newtype<number, typeof Unique.JPY>
type GBP = Newtype<number, typeof Unique.GBP>

const test: <A extends symbol>(a: Newtype<number, A>, b: Newtype<number, A>) => Newtype<number, A>
  = (a, b) => a + b as any // massage the type checker a bit

// fails
test(10 as GBP, 10)
test(10 as GBP, 10 as JPY)

// passes
test(10 as GBP, 10 as GBP)
test(10 as JPY, 10 as JPY)
  1. 保持不变,但这里没有加分,因为您最终得到了一些包含文件路径的非常讨厌的错误消息(实例化,请参阅“错误”):Newtype<number, typeof import("file:///input").JPY>。我希望有一种方法可以让接口扩展或类似的东西变得更干净。
  2. 保持不变,因为Unique.NewtypeUnique.JPY都是unique symbol的。
  3. 因为我们可以使用Newtype的结构来确保类型绝对是Newtype,这是因为它是用Unique.Newtype (即unique symbol )定义的。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61855787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档