typescript - 理解类型断言
问题描述
我只是从打字稿开始,尽管我认为事情会很容易,但打字稿似乎与 javascript 并没有那么相似,而且有点令人困惑
无论如何,在打字稿中(不确定我的代码是否有效)做这样的事情有什么区别
const ua: string = req.headers['user-agent']!
或者根据这个答案是这样的:https ://stackoverflow.com/a/38831495/10433835
const us = <string> req.headers['user-agent']!
Ps:我不确定哪个代码是有效的。
解决方案
const ua: string = req.headers['user-agent']!
意味着您创建一个名为的新变量ua
,该变量被显式设置为字符串类型并为其分配一个值。如果您尝试将不是字符串的内容分配给同一个变量,这将触发错误,例如const ua: string = 42
const us = <string> req.headers['user-agent']!
在这种情况下,您只是创建了一个名为的新变量us
,它没有为它定义显式类型。在这种情况下,TypeScript 将尝试根据您分配的内容进行猜测。例如,看到这个
let a = "hello"; //no type for `a` but assigning a string makes the guess to be `string`
a = 42; //error because it's not a string
当您使用您进行显式类型断言时,<string>
您保证 TS 会猜测类型是string
.
在两者中,第一个更安全,因为你知道你需要一个字符串,如果不是,那么你会得到一个编译时错误。第二种方法依赖于隐式类型猜测,这实际上可能是您的错误。这意味着在编译时这将是正确的,因为您已经否决了编译器,但不一定在运行时工作。这是一个例子:
let a = <string> getData();
function getData(): string | number {
return 42;
}
这将编译,但它不会是正确的,因为你告诉编译器总是期望一个字符串,它实际上可能是一个数字(返回类型是string | number
,所以它可能是)而且,函数只返回一个数字反正。因此,在运行时,您在此之后没有类型保证。与显式键入比较
let a: string = getData();
function getData(): string | number {
return 42;
}
你现在正确地得到一个编译时错误,因为你应该处理当你得到不同类型时发生的事情。
因此,通常应该避免手动类型断言。它可能会导致最初甚至可能不存在但稍后可能会出现的错误 - 例如,上面的代码getData
最初可能只返回string
,因此此时变量的显式和隐式类型之间没有区别a
。类型断言 via<string>
将是多余的。但是,如果函数随后更改为返回string | number
显式类型断言,则变得不可靠。