TypeScript不计算&;的布尔左操作数&;活动

TypeScript不计算&;的布尔左操作数&;活动,typescript,Typescript,我使用的是TypeScript,我有一些类似于下面的代码片段: const getString = (string: string) => string // No errors getString("foo"); // Argument of type 'boolean' is not assignable to parameter of type 'string'.ts(2345) getString(false && "foo&qu

我使用的是TypeScript,我有一些类似于下面的代码片段:

const getString = (string: string) => string

// No errors
getString("foo"); 

// Argument of type 'boolean' is not assignable to parameter of type 'string'.ts(2345)
getString(false && "foo"); 

// No errors
getString(1 > 2 && "foo"); 
我很惊讶地看到,
getString(1>2&&“foo”)
没有抛出错误,因为
1>2
的计算结果为false,这是一个布尔值,
getString()
不接受。为什么TypeScript没有计算
1>2
并抛出错误?

您需要启用-然后,它将按预期生成错误

出于某种奇怪的原因,如果没有该选项,TypeScript会将参数的类型确定为
“|”foo”
——否则,它将是
布尔型的|“foo”


结果,
res
被自动确定为
const res的类型:“|”foo”
。这似乎是一个bug,但我不能完全确定。

如果您能更详细地解释为什么需要启用空检查,以便为strictNullChecks为false时永远不能为
null
undefined
@JörgWMittag生成类型错误,这将非常有用,null和undefined实际上被语言忽略。这可能导致运行时出现意外错误。我相信它是为了方便地从JS迁移到TSIt而设计的,但我也不太理解它
false
既不是空的,也不是未定义的。@yossarian船长:这并不能解释任何事情,因为在这段代码中没有
null
s或
undefined
s。@JörgWMittag我的错。我相信没有这个标志,TS使用惰性求值,并且不检查
1一般来说,Typescript不会试图从数学上证明某个特定的布尔表达式是否总是真的、总是假的,或者可能是真是假。文本类型
true
false
是用于文本的,我看不出让Typescript为非文本布尔表达式推断文本类型有任何价值,如果程序员想要一个常量布尔值,编写文本会更简单。真正的问题是,当第一个操作数不是literal
true
时,为什么像
boolean&&string
这样的表达式可以分配给type
string
const aBool = 1 > 2;
const res = aBool && "foo";