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

如何定义仅含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:02:02