2017-07-31 81 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; 
}