[编辑]这个问题确实是重复的;请看@jcalz在链接帖子上的回答:)
关于TS github的相关讨论:Allowing narrow from any
当我执行{ a: any } & { a: number }
时,TypeScript会将其解析为{ a: any }
。但是,考虑到交集类型的含义,我认为它应该是{ a: number }
,因为number
类型中的值实际上只是这两种类型的交集。所以我不确定这种行为背后的基本原理 - 也许是因为any
被特别对待?
答案 0 :(得分:1)
当您使用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
表现为子类型(较窄的类型,具有{的所有属性{1}}再加上一些)。您可以说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
不会向{}
添加任何属性。
答案 1 :(得分:1)
这是因为你在第一个地方使用any
这是超类型的数字,你使用的是任何和数字的类型检查,所以意味着它可以是任何东西,这意味着它是' s any
!
所以任何覆盖数字类型都是数字的超类型......
在 typescript 中,始终使用特定类型,如果不确定类型,请使用any
...
因此,检查any
就像没有进行任何类型检查一样......
这是来自any
...
任何
我们可能需要描述我们所做的变量类型 不知道我们什么时候写一个应用程序。这些价值可能来临 来自动态内容,例如来自用户或第三方库。在 在这些情况下,我们希望选择退出类型检查并让值 通过编译时检查。为此,我们将这些标记为 任何类型:
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
任何类型都是使用现有JavaScript的强大方式, 允许您逐步选择加入并选择退出类型检查 汇编。你可能希望Object扮演类似的角色 用其他语言做。但是Object类型的变量只允许你 为它们分配任何值 - 你不能调用任意方法 他们,甚至是那些确实存在的人:
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'
如果您知道该类型的某些部分,任何类型也很方便,但是 也许不是全部。例如,你可能有一个数组,但是 数组有不同类型的混合:
let list: any[] = [1, true, "free"];
list[1] = 100;