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