如何创建支持任意键值且检测未定义的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
相关产品推荐
相关产品推荐

