为什么在 TypeScript 中的“任何”字段类型变量上使用“字符串”函数时没有编译时错误?

问题描述

我有以下打字稿代码

 let a; 
 a = "number"; 
 let t = a.endsWith('r'); 
 console.log(t); 

由于 a 没有用类型声明,编译器将其推断为“任何”类型。现在,当我们为它分配字符串值并尝试对这个值使用 'endsWith' 函数时,为什么编译器不给出编译错误,因为 'endsWith' 不是一个适用于 'any' 类型的有效函数。我观察到它可以很好地编译/转换为 Js 并成功执行。 我理解编写代码的正确方法是:

 let a : string; 
 a = "number"; 
 let t = a.endsWith('r'); 
 console.log(t); 

但是为什么它在前面提到的代码块中编译得很好?

解决方法

Any 选择退出类型系统,因此即使 a.endsWith() 实际上是另一种类型,您也不会收到 a 的编译错误。见https://www.typescriptlang.org/docs/handbook/basic-types.html#any

,

Any 数据类型类似于 C# 中的 dynamic 类型,它仅在运行时检查点后分配的方法。所以在编译时读取编码,你可以给它分配任何东西,它会通过编译。只有在运行时,它才会检查附加的方法是否真正可用,否则会给出运行时错误。

,

Any 类型意味着将在运行时决定类型。它包含相同的数据类型将是变量的类型。 示例:

let someVariable: any ;
somVariable = 1000;

somVariable 的 类型将在运行时读取为数字。

somVariable = "string";

如果 somVariable 包含一个字符串,则该类型将在运行时作为字符串读取。

如果存在不匹配,将在运行时产生类型不匹配错误,因为类型是在any的运行时决定的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...