【问题标题】:How to create a specific type in Typescript, based on contents of a JSON response如何根据 JSON 响应的内容在 Typescript 中创建特定类型
【发布时间】:2021-11-07 23:11:04
【问题描述】:

我正在尝试为一个对象创建一个类型,我在 javascript 中使用 console.log 记录了该类型。我访问了我的控制台来查看这个对象的内容,这就是我得到的

{
   SomeAssets: [{id:"SomeArbitaryIdHere"}]
   description: "SomeDescription here"
   id: "SomeID"
   SomeRef: "SomeProdRef"
}

我将如何创建这种类型,这是我尝试但不确定的方法

export type = myObjectType

{
  someAssets: Asset;
  description: string;
  id: string;
  someRef: string;
}

export type = Asset
{
 someArray: string[];
}

这是正确的吗?

【问题讨论】:

    标签: javascript json typescript


    【解决方案1】:

    您问题中的代码有几个语法错误,并且不是有效的 TypeScript。如果您还没有,您应该考虑阅读 TypeScript 手册中的一些 TypeScript 文档; here is a place to get started.

    这是定义一些interfaces 来表示您的对象的一种可能方式:

    interface MyObjectType {
        someAssets: Asset[];
        description: string;
        id: string;
        someRef: string;
    }
    
    interface Asset {
        id: string;
    }
    

    您可以验证您的对象是否可分配给MyObjectType 接口:

    const myObject: MyObjectType = {
        someAssets: [{ id: "SomeArbitaryIdHere" }],
        description: "SomeDescription here",
        id: "SomeID",
        someRef: "SomeProdRef"
    }; // okay, no compiler error.
    

    请注意,我必须更改您的对象以正确格式化; JavaScript object literals 中的属性键值对必须用逗号分隔;您不能仅用换行符将它们分开。

    另外,由于JavaScript is case sensitive,重要的是您的对象键和相应的接口键名称完全相同;我将SomeAssetsSomeRef 分别更改为someAssetssomeRef,选择了lower- 而不是upper-camel case。键名通常以小写字符开头,但如果您的用例要求键为 SomeAssetsSomeRef,则应更改界面中的键以匹配它。

    您可能想要也可能想要export your interfaces from a module,或者对对象类型使用type alias 而不是interface,看起来您可能一直在尝试这样做;但是您是否需要这样做取决于您的用例。我对您的建议是从手册和用 TypeScript 编写的现有代码中更加熟悉 TypeScript,这样您就可以了解您的用例是什么以及该语言如何支持它们。

    Playground link to code

    【讨论】:

    • 其实类型和接口都可以。
    • @ChemiAdel 确实如此,正如我所说:“你可能想也可能不想使用类型别名而不是接口”
    【解决方案2】:

    我认为您正在寻找类似下面的内容。 someAssets 是具有 id 属性的 asset 对象数组

    export type myObjectType =
    {
      someAssets: Asset[];
      description: string;
      id: string;
      someRef: string;
    }
    
    export type Asset =
    {
     id: string;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2018-01-02
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多