如何定义仅含server或client单个属性的TypeScript错误对象类型?
实现仅含单个指定属性的服务端/客户端错误类型
需求是创建错误对象结构,必须仅包含server或client其中一个属性,示例如下:
const serverErr = { server: "Error!" }; const clientErr = { client: "Error!" };
你尝试的IsSingleKey类型存在局限性,无法直接满足需求。我们可以基于原思路调整,实现符合要求的类型:
核心工具类型定义
先拆解并修正原类型逻辑:
// 将联合类型转为交叉类型的工具类型 type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; // 判断类型是否为联合类型的工具类型 type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true; // 修正后的单属性对象类型:传入联合类型时触发错误提示,否则生成对应键的对象 type SingleKeyObject<K extends string, T> = IsUnion<K> extends true ? "仅允许包含单个属性" : Record<K, T>;
适配服务端/客户端错误的最终类型
基于上述工具类型,定义符合需求的错误类型:
// 允许的错误属性键 type ErrorKey = 'server' | 'client'; // 生成仅含单个指定属性的错误类型 type ApiError = { [K in ErrorKey]: SingleKeyObject<K, string>; }[ErrorKey];
验证效果
使用ApiError类型可严格约束对象结构:
// ✅ 合法:仅含server属性 const serverErr: ApiError = { server: "数据库连接失败" }; // ✅ 合法:仅含client属性 const clientErr: ApiError = { client: "参数格式错误" }; // ❌ 报错:不能同时包含两个属性 const invalidErr: ApiError = { server: "错误", client: "错误" }; // ❌ 报错:存在未允许的属性 const unknownErr: ApiError = { other: "错误" };
原方案未生效的原因
原ISingleKey类型直接传入联合类型'server' | 'client'时,会触发联合类型判断并返回错误提示,但无法生成合法的单属性对象类型。通过映射联合类型再取值的方式,我们能遍历每个键生成对应的单属性对象,最终组成合法的类型联合。
内容的提问来源于stack exchange,提问作者Trí Phan
相关产品推荐
相关产品推荐

