如果不改变类型,为什么要使用
as
?我错过了什么?
在第一个例子中,尽管我说它是一个字符串,但我得到了 4。第二个 22 号,即使我说的是数字。
let num1: unknown = 2;
let sum: number = (num1 as string) + 2;
console.log("as string: ", sum); // 4
let num2: unknown = '2';
let sum: number = (num2 as number) + 2;
console.log("as number: ", sum); // 22
Typescript 是一种静态分析代码以防止错误并使代码更安全的工具。我邀请您阅读TypeScript 为何存在?。
正如我所说,它静态地分析你的代码,这意味着 TypeScript 不会在运行时运行:事实上,你的 TypeScript 代码将被构建到 JavaScript 代码中(通常在
/dist
文件夹中),并且你的消费者只会使用JavaScript 代码。
让我们分析一下您所呈现的场景:
let num1: unknown = 2;
let sum: number = (num1 as string) + 2;
console.log("as string: ", sum);
在这里,TypeScript 不会抛出任何错误,因为你可以执行
string + number
(JavaScript 会自动将数字转换为字符串并将其附加到你的第一个),所以如果你 cas num1 as string
,TypeScript 会认为 num
类似于 22
。let num1 = 2;
let sum = num1 + 2;
console.log("as string: ", sum);
您可以轻松预测控制台将打印
4
。
这种不匹配是由于您的
as
转换操作造成的,即告诉编译器“不要担心您的预测,我知道 num1
是 string
”,这是一个强大的工具。这是一个完美的例子,向您展示只有当您确实确定您的断言正确时才应该使用 as
,否则您可能会欺骗 TypeScript 的编译器,它会破坏您项目的类型安全性,以及使用的全部目的TypeScript 位居第一。