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

为何含索引键的类型使用Omit时表现异常?

带索引签名的类型使用Omit后丢失显式属性类型的原因

先看示例代码:

type A = {
    children: any;
    size?: string;
};

type B = Omit<A, 'children'>;
// B的类型为 { size?: string; },符合预期

type Y = {
    [x: string]: any;
    children: any;
    size?: string;
};

type Z = Omit<Y, 'children'>;
// Z的类型变成 { [x: string]: any; },size的类型消失了

这不是bug,是TypeScript处理带索引签名类型的既定行为:

  • 当类型包含字符串索引签名(比如[x: string]: any)时,所有字符串键对应的属性都会被索引签名的类型覆盖。你显式声明的children和size只是索引签名的特例,用来约束特定键的类型,但本质上它们属于索引签名的一部分。
  • Omit<T, K>的作用是移除类型T中的指定键K。对于带索引签名的Y,移除children后,剩下的类型依然保留原有的字符串索引签名——因为索引签名已经涵盖了所有字符串键(包括size),所以TypeScript不会再单独保留size的显式类型定义。

如果需要保留size的类型,可以通过先提取显式属性再移除目标键的方式实现:

type YWithoutIndex = Omit<Pick<Y, 'children' | 'size'>, 'children'>;
// YWithoutIndex的类型为 { size?: string; }

内容的提问来源于stack exchange,提问作者iron9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:32:07