TypeScript中如何检测unknown类型对象的属性键
核心原因
unknown 是 TypeScript 设计的类型安全顶层类型,和放弃类型检查的any不同,TS 强制要求:对unknown类型的值做任何属性访问、方法调用操作前,必须先通过类型守卫收窄类型,证明值的结构符合操作预期。
你写的可选链input?.things?.[0]只能处理值为null/undefined的场景,没法跳过unknown的类型校验规则——TS不会默认unknown类型的值是对象,直接访问属性自然会抛出Object is of type 'unknown'错误。
正确实现
你需要逐层做运行时类型校验,同步完成TS类型收窄,再访问对应路径的属性:
function isFullOfGreatThings(input: unknown) { // 先校验input是非null的对象,排除原始值、null的场景 if (typeof input !== 'object' || input === null) { return false; } // 校验things属性存在 if (!('things' in input)) { return false; } const { things } = input as { things: unknown }; // 校验things是数组,才能安全访问索引0 if (!Array.isArray(things)) { return false; } // 取值判断真值 return Boolean(things[0]); }
注意避坑
- 不要直接把值强转为
any绕开检查:比如写Boolean((input as any)?.things?.[0]),这完全放弃了TS的类型安全保障,违背了你用unknown标记不可信输入的初衷。 - 不要漏掉
input === null的判断:JS里typeof null的返回值也是'object',不排除null的话运行时访问属性会抛错。 - 优先用
in操作符判断属性存在:不要直接调用input.hasOwnProperty('things'),如果输入是无原型对象(比如Object.create(null)创建的对象),本身不存在hasOwnProperty方法,会直接抛运行时错误。
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

