Cra*_*her 2 typedef typescript
我的应用程序中有各种类型的整数 ID(例如 ProductId、UserId 等),我想实现强类型,以便我可以确保将正确的 ID 类型传递给方法。
例如,我想声明GetProduct(productId: ProductId)而不是GetProduct(productId: number)只有 ProductId 类型的变量可以传递给它。
在我的 C 时代,我会使用 typedef - 例如 typedef ProductId int;
在 C# 中,我通过使用隐式转换为 int 运算符和显式转换为 int 运算符定义 ProductId 类来实现这一点。比 typedef 更麻烦,但它有效。
我想弄清楚如何在 Typescript 中做等效的事情。对于打字稿我试过这个:
export class ProductId extends Number {}
Run Code Online (Sandbox Code Playgroud)
但这仍然允许传递一个数字来代替 ProductId。
如何在 TypeScript 中实现这一目标?
可以通过一些努力来做到这一点。
诀窍是将您定义ProductID为 TS 中与数字不同的东西,但在实际作为 Javascript 运行时仍然是一个数字。
我在我的博客上写过这个:https : //evertpot.com/opaque-ts-types/
但我会在这里分享重要的细节:
declare const validProductId: unique symbol;
type ProductId = number & {
[validProductId]: true
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使我们声明了一个“唯一符号”,这也完全从 Javascript 中剥离出来,因此实际上并没有将符号添加到您的 中ProductId,这会很痛苦。
要真正得到一个被识别为 a 的东西ProductId,你需要编写一个断言函数、一个类型保护函数或者只是从一个ProductId实际允许生成 ' 的地方进行转换。
而只是为了重复,有没有实际需要有这个符号添加到您ProductId,这只是确保打字稿识别ProductId从一个独特的类型number。在运行时,它只是一个number.
对于您的用例来说,这是一个很好的模式。它基本上是一个标记,表明这不仅仅是任何数字,它特别是一个已经被您的业务逻辑审查为产品 ID 的数字。
| 归档时间: |
|
| 查看次数: |
4738 次 |
| 最近记录: |