不确定它是否可能,但让我问一下。我开始使用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中,这使得我觉得它有点复杂。由于我正在学习,我想我现在会坚持简单的解决方案。
再次感谢。
答案 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
。然后,我们通过创建一个静态方法来实例化对象来简化它的使用。
我希望这可以回答你的问题或疑问。您没有明确说明您要实现的目标,因此我认为您最好自行决定是否要使用该解决方案。