如何将unknown变量收窄为Record类型?TypeScript类型校验问题
如何在if条件中收窄类型让TypeScript接受Record参数
当前代码中,unknownVar是unknown类型,仅通过unknownVar && typeof unknownVar === 'object'的判断后,TypeScript只会将其识别为object类型。但object包含了像空对象{}这类没有索引签名的类型,而Record<string | number, unknown>要求对象必须支持任意字符串/数字键的访问,因此触发类型不兼容错误。
你可以通过以下两种方式解决:
自定义类型守卫(类型安全首选)
编写一个类型守卫函数,明确告诉TypeScript当条件满足时,变量符合Record<string | number, unknown>类型:declare const unknownVar: unknown; declare function foo(record: Record<string | number, unknown>): void; function isRecord(obj: unknown): obj is Record<string | number, unknown> { return typeof obj === 'object' && obj !== null; } if (isRecord(unknownVar)) { foo(unknownVar); // 类型正确,无错误 }类型断言(简单但需确保运行时安全)
如果你能确定unknownVar确实是符合要求的键值对对象,可以直接使用类型断言跳过TypeScript的检查:declare const unknownVar: unknown; declare function foo(record: Record<string | number, unknown>): void; if (unknownVar && typeof unknownVar === 'object') { foo(unknownVar as Record<string | number, unknown>); // 断言后类型匹配 }
需要注意,类型断言不会提供运行时检查,如果unknownVar是Date、Array这类特殊对象,运行时可能出现不符合预期的行为,因此优先推荐使用自定义类型守卫。
内容的提问来源于stack exchange,提问作者Susccy
相关产品推荐
相关产品推荐

