反应打字稿。 'as number' 和 'Number()' 有什么区别?

React Typescript. What is difference between 'as number' and 'Number()'?

我认为“strVariable as number”将 strVariable 转换为数字类型。
但是折腾了几个小时,我发现它的类型没有被改变。
Number(strVariable) 是关键。

'as number'和'Number()'有什么区别?
如果 'as number' 实际上没有将类型转换为数字,为什么 IDE 的类型错误被删除了??

const strVariable: string = '';
const numVariable: number = 0;
numVariable = strVariable as unknown as number; // I thought it is converting to number but it wasn't
typeof (strVariable as unknown as number); // string. but type error is gone. How?
typeof (Number(strVariable)) // it do converts to number.

as 关键字只是“告诉编译器这是一个数字”。它不会转换任何东西,该值必须是一个 alredy 数字,否则您会招致异常行为。

Number() 是一个 function,具有精确的行为,可以将相同类型的值转换为数字。

Es:

const n: any = 5;
const s: string = "5";

const a = n as number // <- ok... the type of a was "any", but the content is alredy a number.
const b = s as number // <- error
const c = Number(n) // <- ok!
const d = Number(s) // <- ok, Number() can convert a string onto a number

好的,为了理解我们首先需要澄清 TypeScript 给我们的类型系统在运行时并不存在。你可以把它看成你在变量上有 2 个完全不同的类型层,一个是你期望它是的类型——某种虚拟类型(TypeScript 类型),另一个是它实际所在的类型运行时(JavaScript 类型)。

typeof 关键字为您提供变量的运行时类型,而 as 关键字更改变量的 TypeScript 类型。

明白了,我们再看你的具体情况。您正在使用属于 TypeScript 的 as 关键字并执行“虚拟”转换。使用它时,您是在告诉打字稿编译器您希望该变量是一个数字,即使它实际上可能不是一个数字。当使用 typeof 关键字时,您将获得变量的运行时类型,并且因为您只使用了 as 关键字而没有真正转换它,所以它保持不变。

在另一个示例中,您使用了 Number() 函数,实际上您在 JavaScript 运行时转换了变量,这意味着变量的实际类型更改为数字,这意味着当您使用 typeof 关键字检查类型时,您将获得 number 作为变量的类型。

希望这已经足够清楚了,如果还不够清楚的话,这篇关于 TypeScript 中的类型转换的文章可能会帮助澄清一些事情: https://dev.to/ylerjen/typescript-cast-is-a-type-breaker-1jbh