与'any`类型的交叉点

时间:2017-10-25 08:10:53

标签: typescript intersection

[编辑]这个问题确实是重复的;请看@jcalz在链接帖子上的回答:)

关于TS github的相关讨论:Allowing narrow from any

playground

当我执行{ a: any } & { a: number }时,TypeScript会将其解析为{ a: any }。但是,考虑到交集类型的含义,我认为它应该是{ a: number },因为number类型中的值实际上只是这两种类型的交集。所以我不确定这种行为背后的基本原理 - 也许是因为any被特别对待?

2 个答案:

答案 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;