2017-07-31 50 views
0

一些先前SO问题描述了从&&推断出的类型是最后一个表达式的类型的类型。打字稿&&操作者不产生第二操作数

但打字稿2.4.2下面的代码错误报告:

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

错误TS2322:类型“布尔| “”'不能分配给'boolean'类型。 类型“‘’”是不能分配给输入“布尔”。

我无法弄清楚什么是错的。 _.trimStart(sql).toLowerCase().startsWith('select')被推断为布尔值。哪里""来?

回答

0

当字符串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; 
}