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

Posted

技术标签:

【中文标题】为啥即使我有评估数据的条件,打字稿也会抱怨类型?【英文标题】:Why typescript compain about types even though I have a condition to evaluate the data?为什么即使我有评估数据的条件,打字稿也会抱怨类型? 【发布时间】:2019-06-13 05:00:05 【问题描述】:

措辞不好的问题,我不知道该怎么问。

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

Typescript 让我很紧张。我有一个条件来减轻错误并根据收到的数据做正确的事情。 typescript 对我有什么期望?

【问题讨论】:

我认为data 的类型是boolean | a: number; b: string; c: number; d: string; ,也就是false | true | a: number; b: string; c: number; d: string; ,所以你的支票只是从联合中排除了假。试试typeof response.data !== 'boolean' 显然该值最初是一个布尔值或那个对象。你只是排除了错误,所以它仍然可能是真的。没有更多的上下文,很难说你应该如何解决这个问题。为什么是假而不是例如空? @HypeWolf 如果您的服务器返回false | ,那么是的,这将是最好的解决方案。如果它也可以返回true,那么我建议的第一个检查就可以完成这项工作 nullundefined 会不会更适合不存在的对象? 我同意在大多数情况下应避免使用 null,因为它是空引用异常的常见原因,但 null 有有效的用例。但是,我认为使用null 比试图将对象的存在与对象本身混为一谈更可取。 【参考方案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)

【讨论】:

你的方法是更明智的。谢谢,我的朋友。我刚刚从你的回答中学到了很多东西。 如果response 被声明为ServerResponse 类型的对象,编译器知道 response.dataRealData 类型的对象并且你的断言是无用的.如果没有正确声明,编译器会抱怨response 没有属性data【参考方案2】:

我认为

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,

因为你没有声明它是假的还是真的,这只是额外的。

【讨论】:

如果服务器没有任何数据要发送,data 可能为假。正如我几秒钟前在下面的评论中所说,nullundefined 可能意味着服务器没有响应或没有正确响应。 false 将确保该值是预期的。 @HypeWolf 为什么不发送一个空对象来表示没有发送数据?或者,更重要的是,为什么不使用适当的 HTTP 状态码? @Seiyria 我可以发送 204 No Content 你是对的。

以上是关于为啥即使我有评估数据的条件,打字稿也会抱怨类型?的主要内容,如果未能解决你的问题,请参考以下文章

为啥打字稿抱怨对象必须是扩展类型中的对象

当 /// 引用在“use strict”之后时,为啥打字稿会抱怨?

为啥即使我有一个 catch() 函数,我也会收到 UnhandledPromiseRejectionWarning?

打字稿'条件'类型

为啥 Scala 抱怨类型不匹配?

打字稿:为啥类型别名满足约束但相同的接口不满足?