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

Posted

技术标签:

【中文标题】为啥在 TypeScript 中的“任何”字段类型变量上使用“字符串”函数时没有编译时错误?【英文标题】:Why there is no compile time error when 'string' functions are used on an 'any' field type variable in TypeScript?为什么在 TypeScript 中的“任何”字段类型变量上使用“字符串”函数时没有编译时错误? 【发布时间】:2021-05-05 13:38:19 【问题描述】:

我有以下打字稿代码:

 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 所做的——它是用于类型检查的转义子句。 any 值被视为正确使用,无论您如何使用它。如果您调用a.toFixed(2),这是允许的,但这将是一个运行时错误,因为toFixed 仅适用于数值。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

let someVariable: any ;
somVariable = 1000;

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

somVariable = "string";

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

如果存在不匹配,则会在运行时生成类型不匹配错误,因为类型是在运行时确定的 any

【讨论】:

以上是关于为啥在 TypeScript 中的“任何”字段类型变量上使用“字符串”函数时没有编译时错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Typescript 允许将 `a: 1, b: 2` 分配给类型 `a: any | b:任何`? [复制]

为啥 TypeScript 中的类允许使用鸭子类型

为啥括号会影响 TypeScript 中的类型缩小?

为啥 TypeScript 中的 'instanceof' 会给我错误“'Foo' 仅指一种类型,但在这里被用作值。”?

为啥 TypeScript 中的方法链接会导致泛型类型推断失败?

为啥我的 MongoDB ObjectID 没有被识别为 TypeScript 中的类型?