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
相关产品推荐
相关产品推荐

