【发布时间】:2021-05-28 16:01:33
【问题描述】:
一个例子:
type TA = {a:number,b:number}
type TB = {a:number,c:number,d:number}
const t1:Or<TA,TB> = {a:1,b:1} // want
const t2:Or<TA,TB> = {a:1,c:1,d:1} // want
const t3:Or<TA,TB> = {a:1,b:1,c:1} // DON'T want
期望的结果是 t1 有效,因为它完全适合 TA,t2 有效,因为它完全适合 TB,但 t3 无效,因为它不完全适合TA 或TB。
什么时候
type Or<T,U>=T|U
TypeScript 实际上认为t3 是有效的。 TypeScript union type | 还允许合并键对象,有时还允许合并部分对象。
将每种类型放在一个元素数组中,如下所示:
type T0 = {a:number,b:number}
type T1 = {a:number,c:number,d:number}
type Test=[T0]|[T1]
const t1:Test=[{a:1,b:1,}]
const t2:Test=[{a:1,c:1,d:1}]
const t3:Test=[{a:1,b:1,c:1}] // fails as desired
有效,但被测对象也必须放在单元素数组中。
有什么办法可以解决吗?
【问题讨论】:
-
请注意,多余的属性检查仅适用于 object literals,因此这将是 some 实用程序,但仅适用于一些。例如,虽然
let x: TA = {a:1, b:2, c:3};会标记额外的c属性,但let y = {a:1, b:2, c:3}; let x: TA = y;不会。 -
联合 seem to have been played with 和 couple of times 的过多属性检查(请参阅 this search),但未实施。
-
你可以使用tagged types,但我猜你不喜欢。
-
这个stackoverflow.com/questions/65805600/… 的答案可能有用
-
请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?