这个问题在这里已经有了答案:
Type intersections using any
(1 个回答)
4年前关闭。
[编辑] 这个问题确实是重复的;在链接的帖子上看到@jcalz 的回答:)
TS github上相关讨论:Allowing narrow from any
playground
当我这样做时 { a: any } & { a: number }
, TypeScript 将其解析为 { a: any }
.不过考虑到交集类型的含义,我觉得应该是{ a: number }
, 仅作为 number
中的值类型实际上是这两种类型的交集。所以我不确定这种行为背后的基本原理 - 也许是因为 any
被特殊对待?
最佳答案
类型交集
当您使用 T1 & T2
将两种类型相交时,结果类型具有 T1
中的所有属性,以及 T2
中的所有内容.
如果你稍微改变你的例子,使用 string
而不是 any
:
type AType = { a: string } & { a: number }
declare const a: AType
a.a // type: string & number
我们看到 a.a
具有字符串和数字属性的组合。在您的示例中,您可能希望它说
a.a
类型为 any & number
,但这与 any
相同.输入与
any
的交集当类型(例如
number
)与 any
相交时, any
表现为子类型(更窄的类型,具有 number
的所有属性以及更多属性)。你可以说any
扩展 number
.这导致我们的行为与我们在下面看到的相同:type T1 = { a: number, b: number }
type T2 = { a: number }
type Intersection = T1 & T2 // T1 is a subtype of T2, so we get T1
诚然,从我们期望的角度来看,这是不直观的any
成为更宽(更宽容)的类型,而不是更窄的类型。这是一个特例。如果您使用
{}
,您会看到预期的行为(最宽松的类型)而不是 any
, 因为 {}
不向 number
添加任何属性.
关于typescript - 与 `any` 类型相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927219/