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

TypeScript中声明「至少包含指定属性」类型的语法问询

TypeScript中声明包含指定属性的超集类型

首先,你尝试的...any写法在TypeScript里是无效的,这种语法并不存在。要实现必须包含指定属性,同时允许额外任意属性的类型,有两种常用方案:

方案一:直接使用索引签名

在嵌套对象类型中添加字符串索引签名,明确允许任意额外属性:

interface InspectedError {
  originalErrorObj: any;
  errorAsString: string;
  errorObjParsed: {
    message: string;
    stack: string;
    // 允许任意字符串键的额外属性,值类型为any
    [key: string]: any;
  };
}

这种写法简单直接,errorObjParsed必须包含message和stack,同时可以添加任何其他属性。

方案二:自定义SupersetOf工具类型

如果你想要类似Partial<T>的工具类型来统一处理超集场景,可以自己实现SupersetOf<T>:

// 定义超集类型:必须包含T的所有属性,同时允许任意额外属性
type SupersetOf<T> = T & Record<string, any>;

interface InspectedError {
  originalErrorObj: any;
  errorAsString: string;
  errorObjParsed: SupersetOf<{
    message: string;
    stack: string;
  }>;
}

这个工具类型通过交叉类型T & Record<string, any>实现,既保留了T的所有必填属性,又扩展了任意额外属性的能力。

验证你的示例代码

注意你的示例里有个笔误:errorObjectParsed应该改为errorObjParsed,修正后代码可以正常通过类型检查:

const e = new Error('test');
e.foo = 'bar';

const v: InspectedError = {
  originalErrorObj: e,
  errorAsString: util.inspect(e),
  errorObjParsed: {
    message: e.message,
    stack: e.stack,
    ...e
  }
};

此时errorObjParsed包含了必填的message、stack,以及从e扩展来的foo等额外属性,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:48:15