以前的一些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')
被推断为布尔值。 ""
来自哪里?
答案 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;
}