3
这是一个编译得很好的TypeScript代码片段(使用1.5.3)。TypeScript类型函数参数接受任何
function alertNumber(a: number) {
alert(a + 1);
}
var x:any = "string";
alertNumber(x);
这怎么可能是要求某种类型的参数的函数可以用any
类型的参数来调用?
这是一个编译得很好的TypeScript代码片段(使用1.5.3)。TypeScript类型函数参数接受任何
function alertNumber(a: number) {
alert(a + 1);
}
var x:any = "string";
alertNumber(x);
这怎么可能是要求某种类型的参数的函数可以用any
类型的参数来调用?
这是因为您在使用any
类型时选择不进行类型检查。
[有时候]我们希望选择退出类型检查,并让值通过编译时检查。为此,我们将这些标记为“任何”类型。 - Handbook
为了避免麻烦与any
:
--noImplicitAny
编译器选项(或在Visual Studio关闭Allow implicit any types
)。any
类型除非必要,(例var x: any
)
虽然现在我明白这是如何工作的,我还觉得奇怪。即使没有'--noImplicitAny'选项,我也会推测当我向函数声明中添加一个类型时,它会要求任何调用者传递该类型。 “any”的含义仍然应该是“这可以是任何东西”,但是你不应该只在需要特定类型的地方传递“anything”变量。 – LukasH
@LukasH我看你已经用c#编程了。目前,'any'类似于c#中的一个动态变量(例如'dynamic str =“asdf”; int num = str;'可以)。所以就像你应该避免在c#中使用动态类型一样,我会建议避免TypeScript中的任何类型。 –
我理解你的观点,但是当你将现有的JavaScript项目转换为打字稿时,很难避免任何'任何'。对于这种打开'--noImplicitAny'的工作流不是一种选择,因为它需要重写整个代码库。我想要的任何一个对象都可以具有任何属性,但是不能将其传递给请求某种类型的任何地方。 – LukasH