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

为什么即使我有条件评估数据,typescript也会抱怨类型?,typescript,typescript-typings,Typescript,Typescript Typings,这个问题措辞拙劣,我不知道该怎么问 我有一个评估从远程服务器接收的数据的条件。如果不是false,则它包含一个对象 interface serverData { data: boolean|{a: number, b: string, c: number, d: string}, extra: boolean, } getRemoteData(): serverData { return { "extra": false, "data": {

这个问题措辞拙劣,我不知道该怎么问

我有一个评估从远程服务器接收的数据的条件。如果不是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

Typescript抱怨:

类型为'true |{a:number;b:string;c:number;d: 字符串;}不可分配给“serverData”类型的参数。类型 “true”不可分配给类型“serverData”

打字稿弄得我心烦意乱。我有一个适当的条件来缓解错误,并根据收到的数据做正确的事情。typescript对我有什么期望?

我想

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,
}
因为它不需要声明它是假的还是真的,只需要额外声明。

让obj=newdata(response.Data)

问题是typescript不知道
响应.数据
值是
,还是您的“真实数据”

我建议:

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

type ServerData = RealData | false;

interface ServerResponse {
  data: ServerData;
  extra: boolean;
}

我认为
data
的类型是
boolean |{a:number;b:string;c:number;d:string;}
它是
false | true |{a:number;b:string;c:number;d:string;}
所以您的检查只从联合中排除false。尝试
typeof response.data!='布尔值“
显然,该值最初是布尔值或该对象。你只排除了假,所以它可能仍然是真的。没有更多的背景,很难说你应该如何解决这个问题。为什么为false而不是null?@HypeWolf如果您的服务器返回
false{}
则是,这将是最佳解决方案。如果它也能返回
true
,那么我建议的第一个检查就可以了
null
undefined
是否更适合不存在的对象?我同意在大多数情况下应该避免
null
,因为这是null引用异常的常见原因,但是
null
有一些有效的用例。但是,我认为,与试图将对象的存在与对象本身混为一谈相比,使用
null
更可取。
data
如果服务器没有任何数据可发送,则可能为false。正如我几秒钟前在下面的评论中所说的,
null
undefined
可能意味着服务器没有响应或没有正确响应
false
将确保该值是预期值。@HypeWolf为什么不发送一个空对象来表示没有发送数据?或者,更重要的是,为什么不使用合适的HTTP状态码?@Seiyria我可以发送204条消息。没有内容你是对的。你的方法是cleaver。谢谢你,我的朋友。我刚刚从你的回答中学到了很多。如果
response
被声明为
ServerResponse
类型的对象,编译器知道
response.data
RealData
类型的对象,你的断言是无用的。如果声明不正确,编译器会抱怨
响应
没有属性
数据
let obj = new Data(response.data as RealData)