我已经看到了许多不同的方式来做标称类型的打字,但它们似乎都在某种程度上是不够的。我希望所有这些财产都有:
Type 'GBP' is not assignable to type 'JPY'。__tag__键,必须使用unique symbol。<A>(Opaque<number, A>) => Opaque<number, A>。更多的加分,一个语法干净的界面,但我理解这是主观的。
发布于 2020-05-17 17:47:17
这是我发现的最好的方法:
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)https://stackoverflow.com/questions/61855787
复制相似问题