如何用TypeScript定义仅含单个属性的元数据数组类型?
用TypeScript表达指定Meta数组类型的方案
完全可行,根据需求可以选择两种类型定义方式:
基础兼容型(宽松匹配)
如果只需匹配「每个对象以URI为键、值为任意类型」的结构,无需严格限制属性数量,可直接定义:
// 单个元数据项:键为任意URI字符串,值支持任意类型 type MetaItem = { [uri: string]: unknown }; // Meta数组类型 type MetaArray = MetaItem[];
示例用法:
const meta: MetaArray = [ {"http://example.com/rel/1/" : "my meta 14"}, {"http://example.com/rel/2/" : "345"} ];
严格单属性型(限制仅一个键)
如果需要强制每个元数据项只能包含一个属性(避免多键错误),可以通过条件类型实现约束:
// 辅助类型:判断对象是否仅含单个属性 type IsSingleProperty<T> = keyof T extends string ? [keyof T] extends [never] ? false : string extends keyof T ? false : true : false; // 严格版元数据项:仅允许单个URI键,值为任意类型 type StrictMetaItem = { [uri: string]: unknown } & { [K in keyof this]: IsSingleProperty<this> extends true ? unknown : never; }; // 严格版Meta数组 type StrictMetaArray = StrictMetaItem[];
此时若传入含多键的对象,TypeScript会直接报错:
// ❌ 类型错误:对象包含多个属性,不符合StrictMetaItem约束 const invalidMeta: StrictMetaArray = [ {"http://example.com/rel/1/" : "my meta 14", "extraKey": "invalid"} ];
内容的提问来源于stack exchange,提问作者gordie
相关产品推荐
相关产品推荐

