问题描述
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的运行时决定的。