在子界面中覆盖成员类型

时间:2019-04-21 12:53:58

标签: typescript

是否可以扩展接口并覆盖成员的类型,如下面的示例所示?我希望能够做到这一点,以便在创建类型为IPathParam的对象时,编译器知道required属性应为true而不是被忽略或为false 。使用下面的代码,编译器抱怨类型'path'无法分配给类型'header' | 'query'

interface IParam {
  in: 'header' | 'query'
  required?: boolean
  ...
}

interface IPathParam extends IParam {
  in: 'path'
  required: true
}

1 个答案:

答案 0 :(得分:1)

您不能这样做,并且有充分的理由,如评论中所指出。子类型的想法是,子类型的实例仍然是基本类型的实例。更改成员类型将违反此约束。

现在,如果您只想与接口基本相同但成员不同的类型,则可以使用Omit和交集来实现。请注意,此新类型将不是您接口的子类型,但在某些情况下可能仍然有用:

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>

interface IParam {
    in: 'header' | 'query'
    required?: boolean

}

type ISimilarToParam = Omit<IParam, 'in'> & {
    in: 'path'
};