You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中&运算符行为差异原因及交集类型细节问询

TypeScript中&运算符的行为差异及交集类型展开方法

一、&运算符在不同场景的行为差异原因

&运算符的行为差异本质是操作的类型类别不同:

  • 在[K in keyof T & string]: T[K]中,keyof T返回的是目标类型T的键的联合类型(可能包含string、number、symbol三种类型)。这里的&是对联合类型执行交集运算,作用是筛选出同时属于keyof T和string的成员,相当于过滤掉number、symbol类型的键,所以看起来是“移除”非字符串键。
  • 在type FooBar = Foo & Bar中,&作用于对象类型。TypeScript对对象类型的交集规则是合并属性:
    • 若两边属性不冲突,直接合并所有属性;
    • 若属性名冲突,则该属性的类型会变成两个类型的交集(比如{a: string} & {a: number}中,a的类型为string & number,即never)。

二、查看交集类型的详细结构

如果编译器只显示Foo & Bar而不展开,可通过以下方法查看详细结构:

1. 自定义工具类型展开

编写Expand工具类型实现浅展开:

type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;

// 示例使用
type Foo = { A: 'a' };
type Bar = { B: 'b' };
type FooBar = Foo & Bar;
type FooBarExpanded = Expand<FooBar>; // 鼠标悬停可看到 { A: 'a', B: 'b' }

如果需要处理深层嵌套的交集,可使用递归版本的ExpandDeep:

type ExpandDeep<T> = T extends object
  ? T extends infer O ? { [K in keyof O]: ExpandDeep<O[K]> } : never
  : T;

2. 利用编辑器类型提示

创建临时变量并指定交集类型,鼠标悬停即可查看展开后的结构:

const temp: Foo & Bar = {} as any;
// 悬停在temp上,编辑器会显示完整的结构

内容的提问来源于stack exchange,提问作者NeoZoom.lua

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:57:25