【问题标题】:Typescript type aliases allow optional interfacesTypescript 类型别名允许可选接口
【发布时间】:2018-11-06 13:12:54
【问题描述】:

我正在尝试在我的打字稿代码中创建一个新类型,如下所示:

interface required {
  x: string
}

interface optional1 {
  y: string
}

interface optional2 {
  z: string
}

type combined = required & (optional1 | optional2)

我想要的行为是:

  • 所需接口的属性绝对应该存在。
  • 如果有其他属性,它们必须符合 optional1 或 optional 2

【问题讨论】:

  • 您提出的定义有什么问题?

标签: typescript interface type-alias


【解决方案1】:

您需要将可选接口中的属性标记为可选,方法是在它们上使用?

如果你这样做,你的定义就有效,除了一个对象被允许有bothyz属性(type combined = (required & optional1) | (required & optional2);也是如此,这让我很惊讶) :

interface required {
  x: string
}

interface optional1 {
  y?: string               // Note the ?
}

interface optional2 {
  z?: string               // Note the ?
}

type combined = required & (optional1 | optional2);

function foo(x: combined): void {

}

foo({ x: "x" });                 // Works
foo({ x: "x", y: "y" });         // Works
foo({ x: "x", y: "y", z: "z" }); // Works
foo({ x: "x", q: "q" });         // Error because of q
foo({ y: "y" });                 // Error because there's no x

Playground Link

【讨论】:

  • @MuratKaragöz - 不,foo({ x: "x" }); 不适用于 OP 的代码,但他的要求说 if 还有其他属性,表明这种情况需要工作。
  • 这太棒了!但它的问题是如果我在界面中有多个项目。例如foo({ x: "x" , y: "y"}) 仍然有效,即使接口 optional1 具有值:{ y1:string, y2:string }
  • @HassanNaqvi - 是的,我明白你的意思。我倾向于认为foo 需要是单独的功能。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2021-09-16
  • 1970-01-01
  • 2020-09-14
  • 2020-05-27
  • 2016-02-23
相关资源
最近更新 更多