标签: nominal-typing

如果键类型不相交,TypeScript 允许传递不正确的对象值

我正在使用Type Flavoring在我的打字稿应用程序中将不同类型的键分开。但是,我注意到这有一个奇怪的副作用,即允许以下形式的对象

{[key: SomeFlavoredString]: ObjectA}
Run Code Online (Sandbox Code Playgroud)

传递给采用以下形式参数的函数

{[key: SomeOtherFlavoredString]: ObjectB}
Run Code Online (Sandbox Code Playgroud)

不抱怨,这可能会导致一些令人惊讶的错误。这里有一个游乐场

我认为发生的事情是它假设由于键类型是不相交的,所以额外的键是不相关的,因此这些不兼容键的值是不兼容的值并不重要,所以它相当于从打字稿编译器的视角。

有什么方法可以禁用此功能或坚持我的参数在任何键上都不能有任何不兼容的值?这似乎不是理想的行为

javascript javascript-objects typescript nominal-typing

5
推荐指数
0
解决办法
190
查看次数

在 Typescript 中执行名义类型的最强方法?

我见过许多不同的方法来在 Typescript 中执行名义类型,但它们似乎都在某些方面存在不足。我希望保留所有这些属性:

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

语法清晰的界面会带来更多加分,但我知道这是主观的。

generics newtype typescript nominal-typing opaque-types

4
推荐指数
1
解决办法
716
查看次数