【问题标题】:TypeScript && operator doesn't produce the type of the second operandTypeScript && 运算符不会产生第二个操作数的类型
【发布时间】:2018-01-06 19:53:43
【问题描述】:

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

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

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

错误 TS2322: 类型 'boolean | ""' 不能分配给类型 'boolean'。 类型 '""' 不能分配给类型 'boolean'。

我不知道出了什么问题。 _.trimStart(sql).toLowerCase().startsWith('select') 被推断为布尔值。 ""哪里来的?

【问题讨论】:

    标签: typescript


    【解决方案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;
    } 
    

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2015-08-19
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      相关资源
      最近更新 更多