即使我有条件评估数据,为什么打字稿也会抱怨类型?

时间:2019-01-18 22:32:15

标签: typescript typescript-typings

措辞不佳,我不知道该怎么问。

我有一个条件可以评估从远程服务器接收到的数据。如果不是false,则包含一个对象。

interface serverData {
  data: boolean|{a: number, b: string, c: number, d: string},
  extra: boolean,
}

getRemoteData(): serverData {
    return {
      "extra": false,
      "data": {
        a: 15460514569,
        b: "mia6bahBai",
        c: 2019,
        d: 'Lorem Ipsum'
      }
    }
}

dothings() {
  var response = this.getRemoteData()

  if(response.data !== false) { // check if type is serverData or false

    let obj = new Data(response.data) // Expect serverData
  }
}

出于开发目的,response.data返回一个静态对象,但最终可能返回false

打字稿抱怨:

  

“ true”类型的参数| { 一个号码; b:字符串; c:数字; d:   串; }”不可分配给“ serverData”类型的参数。类型   不能将'true'分配给'serverData'类型。.

打字稿让我感到不安。我有一个条件来减轻错误并根据收到的数据采取正确的措施。打字稿在这里对我有什么期望?

2 个答案:

答案 0 :(得分:-1)

我认为

interface serverData {
  data: boolean|{a: number, b: string, c: number, d: string},
  extra: boolean,
}

应该是

interface serverData {
  data: {a: number, b: string, c: number, d: string},
  extra: boolean,
}

因为它,您无需声明它是假还是真,而只是额外地做。

答案 1 :(得分:-1)

let obj = new Data(response.data)

问题在于打字稿不知道response.data的值是truefalse还是您的“真实数据”;

我建议:

interface RealData {
  a: number,
  b: string,
  c: number,
  d: string
}

type ServerData = RealData | false;

interface ServerResponse {
  data: ServerData;
  extra: boolean;
}
let obj = new Data(response.data as RealData)