TypeScript&&运算符不会产生第二个操作数的类型

时间:2017-07-31 09:49:56

标签: typescript

以前的一些SO问题描述了来自&&的推断类型是最后一个表达式的类型。

但是TypeScript 2.4.2报告了以下代码的错误:

function isQuerySql(sql: string): boolean {
  return sql && _.trimStart(sql).toLowerCase().startsWith('select');
} 
  

错误TS2322:输入' boolean | ""'不能分配给' boolean'。   输入'""'不能分配给'布尔'。

我无法弄清楚出了什么问题。 _.trimStart(sql).toLowerCase().startsWith('select')被推断为布尔值。 ""来自哪里?

1 个答案:

答案 0 :(得分:1)

当字符串sql为空时,函数isQuerySql将返回&&之前的表达式,因此它返回一个空字符串:

isQuerySql("") === ""
isQuerySql("select") == true
isQuerySql("foo") == false

所以返回类型确实是boolean | ""

您可以通过明确第一个比较来对此进行排序:

function isQuerySql(sql: string): boolean {
  return sql !== "" && _.trimStart(sql).toLowerCase().startsWith('select');
} 

如果你需要捕获null和undefined,也可以强制它为布尔值:

function isQuerySql(sql: string): boolean {
  return !!sql && _.trimStart(sql).toLowerCase().startsWith('select');
} 

或许这个:

function isQuerySql(sql: string): boolean {
  return sql? _.trimStart(sql).toLowerCase().startsWith('select') : false;
}