ES6类继承/扩展流类型

时间:2018-03-28 14:36:29

标签: javascript reactjs flowtype

我的流式类型如下:

type ModalTypes{
 id: number,
 name: string
}

我想继承我的类的类型定义,并在构造函数中重用它:

class Modal extends ModalTypes {
  constructor(data: ModalTypes) {
    super()
    this.id = data.id
    this.name = data.name
  }
}

可悲的是,这不起作用。我知道我只能扩展一个类但是如何在类中添加一些类型定义。 我不想写这样重复的代码:

class Modal{
  id: number
  name: string
  constructor(data: {id: number, name: string}) {
    super()
    this.id = data.id
    this.name = data.name
  }
}

这里我要添加idname两次,一次添加到Modal类,一次添加到构造函数。
我想只添加一次并防止重复。

2 个答案:

答案 0 :(得分:2)

只需将您的类型更改为:

 class ModalTypes {
   id: number,
   name: string
 }

答案 1 :(得分:0)

在这个实例中,继承并不是你所需要的,即使它可能会节省一些打字(没有双关语!)

您可以使用实用程序$PropertyType<>来避免类型不匹配并至少确保一致性。

Try

type Props = {
  id: number,
  name: string
}

class Modal {
  id: $PropertyType<Props, 'id'>
  name: $PropertyType<Props, 'name'>

  constructor(data: Props) {
    this.id = data.id
    this.name = data.name    
  }

}

令人遗憾的是,流不支持在类级别传播,就像在类型级别一样,它会节省一些键盘时间。另一种方法可能是不在类级别提取属性,而是将它们保留在对象属性中,因此:

Try

type Props = {
  id: number,
  name: string
}

class Modal {
  props: Props

  constructor(props: Props) {
    this.props = props
  }
}

当然,无论何时您想要访问这些属性,这都意味着更多的指法,并且可能不是您想要的自己的属性&#39;在对象上。使用后一种方法,您甚至可以使用泛型来创建可重用的类,这可能具有一定的价值。

Try

type Props = {
  id: number,
  name: string
}

class Modal<T> {
  props: T

  constructor(props: T) {
    this.props = props
  }
}

const modal: Modal<Props> = new Modal({ id: 1, name: 'bob' })