【问题标题】:Typescript not enforcing type with in function parameter打字稿不使用函数参数强制类型
【发布时间】:2017-10-04 13:21:43
【问题描述】:

我有一个非常简单的函数,它接受 3 个整数,将它们加在一起并将总和打印到控制台。

function add(n1, n2, n3) {
    var sum : number = n1 + n2 + n3;

    console.log(sum);
}

我的假设是 sum 是一个整数,因此它强制类型匹配。所以我尝试了这个。

add(1,2,"Henok");

TypeScript 不会抱怨,它只是打印出3Henok。为什么?


toskv 的评论中回答他提到了两件事

实际上你写的是 var sum:number = (1 as any) + (2 as any) + ('hehe3' as any) 因为参数的类型是 未指定,默认为任何

为了强制编译时抱怨他添加了这个建议

您可以在编译时启用 noImplicitAny 选项,并且 tsc 将 抱怨你没有正确输入你的代码。

这对我有用。谢谢toskv。

【问题讨论】:

  • 嗯.. 你是怎么试过的?类型检查仅在编译时强制执行。在运行时它只是 javascript。
  • @toskv 我明白这只是编译时检查。我把结果只是说它确实通过了“编译时检查”

标签: typescript casting


【解决方案1】:

参数还应该在 typescript 中指定类型以查看编译错误。

function add(n1:number, n2:number, n3:number) {
    var sum : number = n1 + n2 + n3;

    console.log(sum);
}

add(1,2, "Henok"); // compilation error

感谢 tosky

默认情况下,未标记任何类型的参数/变量被视为 "any" ,any 字面上是任何东西(任何类型),并且不对任何类型执行任何类型检查。

不要将anyobject 混淆,如果您使用的是C# 之类的东西,那么any 类似于dynamic,其中类型是在运行时确定的。

所以,表达式

var sum:number = n1 + n2 + n3

其实是

var sum:number = (n1 as any) + (n2 as any) + (n3 as any)

【讨论】:

  • 值得一提的是,默认情况下参数的类型为any
  • 我知道,如果你写var sum : number = 1 + 2 + "Henok";'它不起作用(编译时错误)但不在函数内部。这是我不希望看到的。
  • 其实你写的是var sum:number = (1 as any) + (2 as any) + ('hehe3' as any),因为没有指定参数的类型,默认为any
  • 哦,我明白了,我假设编译器在编译时而不是在运行时计算出正确的类型。
  • 您可以在编译时启用noImplicitAny 选项,tsc 会抱怨您没有正确键入代码。 :)
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2019-03-20
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2022-01-26
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多