如何为对象/数组创建判断指定索引存在的TypeScript类型守卫?
TypeScript类型守卫:判断对象/数组指定索引值为数字的实现与问题解决
我希望为对象或数组创建一个TypeScript类型守卫,用于判断其是否包含指定索引(无论该索引是属性还是数组下标),且该索引对应的值为数字。现有如下函数实现及使用示例:
export function hasIndex(v: unknown, i = 0): v is [typeof keyof i] { const p = (v as Record<PropertyKey, unknown>)?.[i]; return typeof p === 'number' || p instanceof Number; }
使用示例:
export function extractIndex(v: unknown, i = 0) { let x = 0; if (hasIndex(v, i)) { x = v[i]; // <-- 期望: `v[i]`类型为`number`,而非`number | undefined` } return x; }
已解决
感谢@jcalz和@Alexander Nenashev!我之前完全没想到能在参数里这么用as。extractIndex<K extends number>的细节解决了@jcalz之前指出的问题,但我还有个疑问:既然参数默认值是数字,TypeScript难道不能自动推断类型吗?不管怎样,真的非常感谢!找到这个解决方案前我碰了不少壁,但学会之后发现其实很简单。
{ [i in K]: number }
内容的提问来源于stack exchange,提问作者Adrian Miranda
相关产品推荐
相关产品推荐

