【问题标题】:Typescript, JSON arrays, optional properties. Typescript is too helpful打字稿、JSON 数组、可选属性。打字稿太有用了
【发布时间】:2016-11-01 23:33:22
【问题描述】:

我有一个这样的打字稿对象:

class myObj {
   public param1,
   public param2,
   public param3
}

在我的另一个对象中,我有一个该对象的数组

class otherObj {
   public arrayOfMyObj:myObj[]

   constructor(){
       this.arrayOfMyObj = [{param1: "value", param2: "value"}]
   }
}

但是此代码会引发错误,因为 JSON 数组中的第一项与 myObj 不完全匹配(它缺少 param3),如果有任何方法可以使其成为可选或只是不检查它?显然,我通常只会创建一个 new myObj 并填充它,但这是一个非常长的硬编码 JSON 数组。

【问题讨论】:

  • 如果你不调用new myObj(),那么你的类型是错误的。 Typescript 并没有“太有帮助”,它完全按照它的用途来验证类型。
  • 如果您将myObj 设为接口,则可以声明可选字段。它还可以更好地匹配您在这里没有调用任何构造函数的事实。

标签: arrays json typescript


【解决方案1】:

也许this answer 会帮助你

另一种方法是使用 Object.assign 来扩展有效的类型化对象 使用您只需要的属性(在此省略属性 ac 例子)

export class A {
    a:number=1;
    b:number;
    c:string;
    d:string; }

let validA:A = Object.assign(new A(),{
    b:3,
    d:'Lorem ipsum' 
}); 

我个人更喜欢这种语法来避免多行对象初始化和创建一个无聊的东西 接口(所以如果一个对应的类,另一个文件完全没用 存在)对于我的应用程序的每个模型。

此外,不要犹豫,在你的类中设置默认值 定义,即使在这种情况下它不是强制性的。

最后一件重要的事情是你不要在这个 大小写(与 {} 强制转换相反)

【讨论】:

    【解决方案2】:

    它看起来像这样:

    interface IMyObj {
       param1: string;
       param2: string;
       param3?: any;
    }
    
    
    class otherObj {
       public arrayOfMyObj: IMyObj[]
    
       constructor() {
           this.arrayOfMyObj = [{ param1: "value", param2: "value" }]
       }
    }
    

    注意

    默认情况下所有类成员都是公共的。

    最好指定变量的类型。未指定的类型是“任何”,如果类型检查失败,您将不会意识到可能的错误。

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2018-06-05
      • 2022-11-19
      • 1970-01-01
      • 2023-03-07
      • 2021-12-30
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多