为啥在 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 中的 'instanceof' 会给我错误“'Foo' 仅指一种类型,但在这里被用作值。”?