I’m trying to apply a type if the object has x
. What I tried had unexpected results. Can anyone explain the results andor offer a solution?
interface BaseType {
x?: number;
a?: string;
b?: number;
}
interface WithoutX extends Omit<BaseType, "x"> {
};
interface WithX extends Omit<BaseType, "x"> {
x: any;
y: string;
};
type ConditionalType = WithX | WithoutX;
// No `x` or `y`, conforms to WithoutX
const validObject1: ConditionalType = {
a: "hello",
b: 42
};
// Has `x` and `y`, conforms to WithX
const validObject2: ConditionalType = {
a: "world",
x: 10,
y: "required"
};
// This should cause a type error because `y` is required if `x` is present
const shouldBeInvalidButIsNot: ConditionalType = {
a: "typescript",
x: 10
};
const invalidObjectBecauseX: WithoutX = {
a: "typescript",
x: 10
};
const invalidObjectBecauseYMissing: WithX = {
a: "typescript",
x: 10
};
https://www.typescriptlang.org/play/?#code/JYOwLgpgTgZghgYwgAgEJwM4QCoE8AOKA3gLABQyyAHgPwBcyIArgLYBG0A3OZXPchjBRQAc24Vkbfs3ZdyAX3LlQkWIhQB1YGAAWAeyZgAGsghVIIACYZkAeRbaAPOix5CAGmQAiKl4B8yKQSCuLK4NDwSMhauiZmFtZ2DmDOmDgEEJ4+-oE81AxwILjilLgMgsIgYiFKZGAZyACqIMB6IG4oALzR2jomAD49ugbGoWQA9OPIAHJ6yAAGVPPIelALuPOeCG0wqyw2YHMx+oZG5NsggsgAbnAANsCWtmwAVhAIYACMDM2t7Q3dIK8BheHQQO53PRedx5NgMAAsACYamRyJNkAAJTALJbIQqWdabZAXXZQfbIQ5DPrnNpXW4PJ6vd5gRE-FptDrIQF5OAggDuqzulmheSoDE+AAYYRIyt4oBAAI5MYDy4UotFTbA6YA2DAnIXEuBMLB4ikNaBQVaSd5Gk3zDbIHXIeVKlUQAnAGA45ZO-DyrDgGmXMACfWWVAQACSIHpj1QhkjGFmYDZf053IkvO89UIGAQwnwYBFEjFyEl6rIFyuoFjjLeHwjCFtECMDGOIxMGeB2YyeYLRellFL5bI8jGVZDNfuj2e9bAjebAE0ALI6jCiNu9Tu5TMgnMQPvAQvFofiiUhIA