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

如何创建支持任意键值且检测未定义的TypeScript类型

实现带严格未定义检查的AnyObject类型

要实现你需要的AnyObject类型,核心是通过递归定义可选属性,让每个层级的属性都存在undefined的可能性,同时兼容数组、函数等多种类型:

type AnyObject = {
  [key: string]: AnyValue | undefined;
};

type AnyValue = 
  | AnyObject 
  | any[] 
  | Function 
  | string 
  | number 
  | boolean 
  | null 
  | undefined;

为什么这个类型可行?

  • 递归结构支持任意嵌套的对象,每个属性都被标记为「可能为undefined」,TypeScript会严格检查非可选链的直接访问
  • AnyValue覆盖了数组、函数以及所有基础类型,适配HTML节点这类复杂场景

验证示例

符合预期的类型检查结果:

const a = {} as AnyObject;
console.log(a.b?.c); // ✅ 可选链操作,类型检查通过
console.log(a.b.c);  // ❌ 触发类型错误:对象可能为 'undefined'

const node = {} as AnyObject;
console.log(node.children?.[0]?.value); // ✅ 数组嵌套访问正常
console.log(node.properties.onClick);   // ❌ 触发类型错误:对象可能为 'undefined'

为什么原写法无效?

你提到的以下写法无法触发错误,原因是any会绕过TypeScript的类型检查:

type AnyObject = {
  [key: string]: any | undefined
};

当访问a.b.c时,a.b被推断为any,TypeScript不会对any类型的属性访问做未定义检查,因此不会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:11