如何在TypeScript中实现类似Swift的对象类型转换与取值?
Swift字典校验逻辑的TypeScript等价实现优化
先看你给出的原Swift代码:
if let ddd = internalRepresentation as? [String: Any], let key = key, let a = ddd[key]
这段代码核心做了三个校验:
- 确认
internalRepresentation能转为字典类型并赋值给ddd - 确保
key不为nil - 确保字典里
key对应的非nil值存在,赋值给a
你当前写的TypeScript代码只完成了基础的类型判断,还缺少对key有效性、ddd[key]存在性的校验,而且没排除null(因为typeof null === 'object',会被误判)。下面是几种更简洁严谨的等价实现:
完整校验的紧凑写法
if ( internalRepresentation !== null && typeof internalRepresentation === 'object' && typeof key === 'string' && key in internalRepresentation ) { const ddd = internalRepresentation as Record<string, unknown>; const a = ddd[key]; // 此处a已确保存在,可直接使用 }
复用性更强的类型守卫写法
如果需要多次做这类校验,可以封装类型守卫函数:
// 类型守卫:判断是否为非空字典 function isNonEmptyDict(obj: unknown): obj is Record<string, unknown> { return obj !== null && typeof obj === 'object'; } // 使用场景 if (isNonEmptyDict(internalRepresentation) && typeof key === 'string' && key in internalRepresentation) { const a = internalRepresentation[key]; // TS会自动推断a的类型,无需额外断言 }
贴近Swift可选绑定的链式写法
如果想更贴近Swift的可选绑定风格,可以用条件链直接取值:
const a = internalRepresentation !== null && typeof internalRepresentation === 'object' && typeof key === 'string' ? internalRepresentation[key] : undefined; if (a !== undefined) { // 这里使用a即可 }
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

