Псевдонимы типов Typescript допускают дополнительные интерфейсы - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать новый тип в моем коде машинописи следующим образом:

interface required {
  x: string
}

interface optional1 {
  y: string
}

interface optional2 {
  z: string
}

type combined = required & (optional1 | optional2)

Мне нужно поведение:

  • обязательно должны присутствовать свойства требуемого интерфейса.
  • Если имеются дополнительные свойства, они должны соответствовать необязательному1 или необязательному 2

1 Ответ

0 голосов
/ 06 ноября 2018

Вам необходимо пометить свойства в дополнительных интерфейсах как необязательные, используя ? для них.

Если вы сделаете это, ваше определение сработает, за исключением того, что объекту разрешено иметь оба y и z свойства (это также верно для 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

...