TypeScrip 3.x:访问类型未知的属性 [英] TypeScript 3.x: Access properties of type unknown
问题描述
我从TypeScrip文档中看到,您不能从类型UNKNOWN访问属性:
// No property accesses, element accesses, or function calls
function f11(x: unknown) {
x.foo; // Error
x[5]; // Error
x(); // Error
new x(); // Error
}
但我不明白为什么?如果我可以分配包括对象在内的每个值,为什么我无法访问属性?
我遇到了以下情况:我有一个any
类型的对象,我将其传递给Object.entries
方法,然后调用forEach
。
因为它是any
类型,forEach调用参数将是一个数组,其中第一个元素为字符串类型,第二个元素为未知类型。
在我的例子中,第二个元素是一个对象,但如果不转换它的类型,我就无法访问它的属性,这似乎是错误的。
下面是一个抛出TS错误的示例(这只是一个抽象,我知道在本例中将其声明为Any是没有意义的):
const obj: any = {
val1: "someval",
val2: {
some: "some",
object: "object",
},
};
Object.entries(obj).forEach(el => {
if (el[1].some) {
console.log(el);
}
});
我猜这也可能是Object.entries
方法的类型错误,但我仍然希望解释一下,为什么我无法访问未知类型的属性。
作为总结,我的问题是:
- 为什么即使未知类型可以是对象,我也无法访问未知类型的属性?
- 我猜出现上述问题是有原因的,但是
Object.entries
不应该返回一个带有元素nr的数组吗?类型为字符串且元素为nr的0。任何类型的%1?
推荐答案
我认为为了回答您的问题,重要的是提供一些关于any
与unknown
的上下文。虽然您可以在official TypeScript documentation中找到一个详尽的比较列表,但我认为我可以冒昧地将这篇文章缩短为几个声明:any
基本上是一种适用于所有类型的,因此不是类型安全。所谓类型安全,是指您可以访问不存在的any
的运行时属性。
unknown
不同。unknown
在这方面与any
相反。它代表了any
的类型安全版本,声明"我不会假装我适合所有东西,因为我不适合"。因此unknown
需要额外强制转换为所需类型才能工作(因为它本身没有任何属性)。
现在,来回答实际的问题。为什么Object.entries
使用unknown
而不是any
?因为说"在使用前将此未知值转换为您需要的任何值,我不会假定我知道它是哪种类型"比"我不知道它是哪种类型,但我假定它具有所有可能类型的所有可能属性"更安全。
这篇关于TypeScrip 3.x:访问类型未知的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!