2015-08-26 86 views
3

这是一个编译得很好的TypeScript代码片段(使用1.5.3)。TypeScript类型函数参数接受任何

function alertNumber(a: number) { 
    alert(a + 1); 
} 
var x:any = "string"; 
alertNumber(x); 

这怎么可能是要求某种类型的参数的函数可以用any类型的参数来调用?

回答

4

这是因为您在使用any类型时选择不进行类型检查。

[有时候]我们希望选择退出类型检查,并让值通过编译时检查。为此,我们将这些标记为“任何”类型。 - Handbook

为了避免麻烦与any

  1. 使用--noImplicitAny编译器选项(或在Visual Studio关闭Allow implicit any types)。
  2. 不要使用显式any类型除非必要,(例var x: any
+1

虽然现在我明白这是如何工作的,我还觉得奇怪。即使没有'--noImplicitAny'选项,我也会推测当我向函数声明中添加一个类型时,它会要求任何调用者传递该类型。 “any”的含义仍然应该是“这可以是任何东西”,但是你不应该只在需要特定类型的地方传递“anything”变量。 – LukasH

+0

@LukasH我看你已经用c#编程了。目前,'any'类似于c#中的一个动态变量(例如'dynamic str =“asdf”; int num = str;'可以)。所以就像你应该避免在c#中使用动态类型一样,我会建议避免TypeScript中的任何类型。 –

+0

我理解你的观点,但是当你将现有的JavaScript项目转换为打字稿时,很难避免任何'任何'。对于这种打开'--noImplicitAny'的工作流不是一种选择,因为它需要重写整个代码库。我想要的任何一个对象都可以具有任何属性,但是不能将其传递给请求某种类型的任何地方。 – LukasH