首页 > 解决方案 > 理解类型断言

问题描述

我只是从打字稿开始,尽管我认为事情会很容易,但打字稿似乎与 javascript 并没有那么相似,而且有点令人困惑

无论如何,在打字稿中(不确定我的代码是否有效)做这样的事情有什么区别

    const ua: string = req.headers['user-agent']!

或者根据这个答案是这样的:https ://stackoverflow.com/a/38831495/10433835

const us = <string> req.headers['user-agent']!

Ps:我不确定哪个代码是有效的。

标签: typescript

解决方案


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显式类型断言,则变得不可靠。


推荐阅读