【发布时间】:2013-11-20 10:40:00
【问题描述】:
在 Typescript 中我可以这样做:
var xxx : some_type;
if (xxx)
foo();
else
bar();
此处的 xxx 将被视为布尔值,无论其类型如何。
我想在函数参数中做同样的事情。我有这个功能:
function foo(b : boolean) { ... }
我希望能够调用 foo(xxx) 并将 xxx 视为布尔值,无论其类型如何。但是 Typescript 不允许这样做。
我试过了:
foo(<boolean>xxx);
但 Typescript 也不允许这样做。
我可以这样做:
foo(xxx ? true : false);
但这似乎有点傻。有没有更好的方法?
【问题讨论】:
-
你想要做的是基于真假逻辑的松散类型。 TypeScript 的主要目的是为 JavaScript 添加静态类型,正是为了防止你进行松散的类型。因此,您实际上是在尝试做一些 TypeScript 旨在防止的事情。我建议分析你传递的参数可以是什么类型并放入重载定义中。
-
这里的问题是一致性。如果 TypeScript 很高兴让我在
if (xxx)中使用非布尔值,那么我没有理由不能在其他布尔上下文中使用非布尔值。在我看来,它应该要么允许两者,要么禁止两者。 -
Typescript 对此并不“满意”,Typescript 向后兼容 JavaScript。将“if”视为一个函数,其参数类型为 Any。这也是您的三元表达式有效的原因。 TS 不鼓励这种草率的打字,但为了向后兼容而容忍它。下面使用
!!的答案有效,因为 not 运算符的输入是 Any,输出是布尔值。
标签: typescript