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

如何在TypeScript中定义仅允许空对象的类型?

如何在TypeScript中定义仅允许空对象的类型?

刚好之前也遇到过这个需求!TypeScript里的空接口{}确实有点“宽松”——它允许任何对象(甚至带属性的)赋值给它,因为它只表示“没有必填属性”,但不限制额外属性。要实现**只能是空对象(完全没有任何属性)**的类型,有几种实用的方法:


方法1:使用索引签名 + never类型

这是最直观的写法,通过索引签名规定所有可能的键对应的属性值都必须是never类型:

type EmptyObject = {
  [key: string]: never;
};

never是TypeScript中最底层的类型,没有任何值能匹配它。所以只要你给这个类型的对象添加任何属性,都会触发类型错误:

// ✅ 合法:空对象
const validEmpty: EmptyObject = {};

// ❌ 报错:类型'string'不能赋值给类型'never'
const invalid1: EmptyObject = { asda: "hello" };

// ❌ 同样报错:类型'number'不能赋值给类型'never'
const invalid2: EmptyObject = { age: 25 };

方法2:用Record工具类型简化写法

Record<string, never>和上面的索引签名是完全等价的,只是写法更简洁:

type EmptyObject = Record<string, never>;

用法和效果和方法1完全一致,适合喜欢用TypeScript内置工具类型的场景。

方法3:严格禁止Symbol类型的属性(可选)

如果需要连Symbol作为键的属性也禁止,可以扩展类型覆盖Symbol索引:

type EmptyObject = {
  [key: string]: never;
  [key: symbol]: never;
};

或者用Record联合键类型:

type EmptyObject = Record<string | symbol, never>;

这样连Symbol属性也会被拦截:

const testSym = Symbol("test");
// ❌ 报错:类型'string'不能赋值给类型'never'
const invalid: EmptyObject = { [testSym]: "value" };

补充:为什么空接口{}不行?

空接口{}的语义是“这个对象没有必须要存在的属性”,但它并不限制额外属性——所以任何对象(哪怕带一堆属性)都能赋值给{}类型。而我们上面定义的EmptyObject则是通过never类型,直接否定了任何属性存在的可能性,完美实现“仅允许空对象”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:02:18