TypeScript使用数组

时间:2018-02-23 21:45:12

标签: angular typescript swagger

不确定它是否可能,但让我问一下。我开始使用Angular 4并尝试实现父接口。

export interface Devices extends Array<Device> {
}

以下给我一个错误&#39; Class&#39; DevicesModel&#39;错误地实现了界面&#39;设备&#39;。财产包括&#39;在DevicesModel&#39;。

类型中缺少
export class DevicesModel implements Devices {
    constructor() {
    }
}

我猜是因为它是一个数组,我不允许在模型中添加其他属性。

我这样做的原因是。设备是从swagger文档生成的。我想将swagger模型与应用程序模型分开。所以我正在实现所有swagger生成的模型,这样如果我必须修改模型,当我重新生成它们时我不会丢失它们。 如果以上是不可能的,我想我必须使用组合技术来做我想做的事。

由于

编辑:

更多信息:

这是我的招摇YAML看起来像定义休息服务。

Devices:
  type: array
  description: list of devices
  items:
    $ref: '#/definitions/Device'
Service:
  type: object
  required:
    - serviceId
    - serviceName
  properties:
    serviceId:
      type: string
    deviceName:
      type: string
    serviceName:
      type: string
    port:
      type: string
    tag:
      type: string

我的swagger生成的Rest服务器模型如下所示:

@ApiModel(description = "list of devices")
@Validated
@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2018-02-23T10:57:40.757-05:00")

public class Devices extends ArrayList<Device> implements Serializable {
  private static final long serialVersionUID = 1L;
....
}

我使用swagger codegen生成typescript rest客户端,它生成的设备模型为:

export interface Devices extends Array<Device> {
}

我认为我最安全的选择是更改Yaml,以便生成的对象不会扩展数组但使用合成。像这样:

public class Devices implements Serializable 
{
     private static final long serialVersionUID = 1L;
     private List<Device> devices;
     ....
}

然后打字稿:

export interface Devices {
     devices: Array<Device>;
}

正如我所说的,我刚开始使用Typescript和Angular并且是Java编码器,我正在尝试将Java技术应用到TypeScript中,这使得我觉得它有点复杂。由于我正在学习,我想我现在会坚持简单的解决方案。

再次感谢。

1 个答案:

答案 0 :(得分:1)

通过使您的界面Devices扩展Array<Device>,预计实现Devices的任何类都会实现Array的所有方法,更具体地说是Array<Device>在这里。最后,您尝试在此处展开​​Array,因此您必须为您的班级定义all the methods available in an Array,以便将其视为一个,例如include但还有很多其他的。

虽然这是对正在发生的事情的解释,但它可能不是您正在寻找的事情。 This article可能是一个有趣的读物,除了不尝试扩展Array外,还有什么可能性。

请记住,在任何情况下,TypeScript都以JavaScript结尾。由于您无法在JavaScript中扩展Array,因此在TypeScript中可能会有点棘手,或者至少不如您预期的那么自然。

本文介绍了解决问题的多种方法,每种方法都有不同的属性。基本上,解决方案包括:

  • 在运行时替换所有缺少的属性(错误,因为速度较慢并且中断继承)
  • 不首先扩展Array,而拥有参数Array
  • 通过屏蔽你常用的类构造函数来欺骗事物以某种逻辑方式运行,否则必须调用它以便按照你想要的方式创建类。

虽然最后的解决方案似乎是最棘手的,但它可能是最好的&#34;这是因为它在使用它时不容易出错。

我只是在这里粘贴了文章的最后一段代码来澄清事情:

class MyArray<T> extends Array<T> {
    private constructor(items?: Array<T>) {
        super(...items)
    }
    static create<T>(): MyArray<T> {
        return Object.create(MyArray.prototype);
    }
}

// Works
const myArray = MyArray.create<string>(); 

在这里,我们成功地创建了一个我们想要的类型的实例,而不使用它的经典构造函数,而是使用Object.create。然后,我们通过创建一个静态方法来实例化对象来简化它的使用。

我希望这可以回答你的问题或疑问。您没有明确说明您要实现的目标,因此我认为您最好自行决定是否要使用该解决方案。