为什么在 TypeScript 中对 'any' 字段类型变量使用 'string' 函数时没有编译时错误?

Why there is no compile time error when 'string' functions are used on an 'any' field type variable in TypeScript?

我有以下打字稿代码:

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

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

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

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

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

Any 数据类型类似于 C# 中的 dynamic 类型,它在 运行 时间检查点后分配的方法只要。所以在编译时——阅读编码,你可以给它赋值任何东西,它就会通过编译。只有在 运行 时间,它会检查附加的方法是否真正可用,如果不是它会给出 运行 时间错误。

任意类型表示类型将在运行时决定。它包含的哪种类型的数据将是变量的类型。 示例:

let someVariable: any ;
somVariable = 1000;

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

somVariable = "string";

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

类型不匹配错误将在运行时产生,因为类型是在任何的运行时决定的。 .