有没有办法在TypeScript中测试一个值是否是Record
类型的示例?我需要一个能够正确区分变量何时可能也是数组的case。
function(a: Record<string,string>|string[]) {
if( a instanceof Record ) {
do_stuff( a.key )
}
}
我知道这在JavaScript中是有问题的,因为我的两个类型都是对象,因此在这两种情况下都是typeof(a) == "object"
。
- 我知道
Record
类型在运行时实际上并不存在,但是该示例应该阐明我尝试做的事情。同样重要的是,测试正确地通知TypeScript缩小的类型,以便a.key
不会产生错误。*
2条答案
按热度按时间ruarlubt1#
根据文档,
Record<K, V>
是一个键为K
,值为V
的对象。由于原型链的存在,“真正的”Record<string, string>
并不存在,这会导致对象继承例如.toString()
方法。但是考虑完整的继承属性集会很麻烦(related discussion on the TS GitHub),因此最清楚的做法是将Record
类型与an object's own properties一起使用:这意味着,通过将一种或多种迭代对象中属性的方法与TypeScript的类型 predicate 相结合,您很可能已经足够了:
现在您将拥有:
hjqgdpho2#
您可以使用型别保护,根据执行阶段值来缩小的型别范围。您可以定义型别保护函式来检查的值,如果是预期的型别,则传回true,否则传回false。例如,您可以定义如下的型别保护:
然后,您可以在if陈述式中使用这个型别保护,根据执行阶段值缩小的型别范围:
此方法可让您正确区分这两种型别,并存取它们的属性,而不会发生型别错误。