【问题标题】:Typeguard for property财产的打字员
【发布时间】:2020-04-29 20:01:34
【问题描述】:

假设我们有一个如下所示的类:

class RawResult {
  private raw: string | undefined;
  get exists(): boolean {
    return this.raw !== undefined;
  }
  decode(): Result | undefined {
    if (this.raw === undefined) {
       return undefined;
    }
    return someExpensiveDecoding(this.raw); 
  }
}

有没有办法告诉 TS 编译器 result.exists 暗示 result.decode() 不会是 undefined

这是基于Firestore DocumentSnapshot's API,其中有exists 属性和data 方法。但是,为了确保data() 不是undefined,我们需要执行以下操作:

const data = result.data()
if (data) {
   // do something with data
}

【问题讨论】:

    标签: typescript google-cloud-firestore


    【解决方案1】:

    不带属性,但如果您可以将该 getter 转换为普通方法,则可以这样做:

    type Result = {}
    
    interface RawResultExists extends RawResult {
        decode(): Result
    }
    
    class RawResult {
        private raw: string | undefined;
        exists(): this is RawResultExists {
            return this.raw !== undefined;
        }
        decode() {
            if (this.raw === undefined) {
                return undefined;
            }
            return this.raw as Result
        }
    }
    
    const rawResult = new RawResult();
    
    if (rawResult.exists()) {
        const data = rawResult.decode()
    }
    
    

    【讨论】:

    【解决方案2】:

    不,但您可以使用! operator 告诉编译器您知道自己在做什么:

    if (rawResult.exists()) {
        const result = rawResult.decode()!   // always a Result
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2011-02-15
      • 2018-02-19
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多