typescript - 与 `any` 类型相交

标签 typescript intersection

这个问题在这里已经有了答案:





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/

相关文章:

javascript - 当我创建类型化对象数组时,为什么没有调用我的自定义 setter?

mysql获取2个结果集的差异

c++ - C++ 中直线与线段的交点

java - Java中如何找到多个Map的共同部分?

python - 查找共享值的行

algorithm - 如何检测线段与圆柱相交?

javascript - typescript |从对象 T 中提取具有类型 K 值的所有键名

javascript - 可以使用 AngularJS 和 Typescript 进行 Plunker 吗?

javascript - 用于将字符串中的单词大写的管道中出现错误

typescript - 在 TypeScript 中,什么是 !取消引用成员时使用(感叹号/感叹号)运算符?