Home > other >  Conditional generic type Property '...' does not exist on type '...'
Conditional generic type Property '...' does not exist on type '...'

Time:03-29

TypeScript Playground

type Foo<BooleanParameter extends boolean> = { boolean_parameter: BooleanParameter } & (BooleanParameter extends true ? { first_parameter: number } : { second_parameter: string })

const bar = <BooleanParameter extends boolean>(foo: Foo<BooleanParameter>) => {
    if (foo.boolean_parameter) {
        //foo.first_parameter Property 'first_parameter' does not exist on type 'Foo<BooleanParameter>'.
    } else {
        //foo.second_parameter Property 'second_parameter' does not exist on type 'Foo<BooleanParameter>'.
    }
}

Why can't I access first_parameter and second_parameter when boolean_parameter is generic?

CodePudding user response:

Does this work for you...

type TrueBoolean = { boolean_parameter: true } & { first_parameter: number };
type FalseBoolean = { boolean_parameter: false } & { second_parameter: string };

type Foo<B extends boolean> = B extends true ? TrueBoolean : FalseBoolean;

const bar = <B extends boolean>(foo: Foo<B>) => {
  if (foo.boolean_parameter) {
    return foo.first_parameter;
  } else {
    return foo.second_parameter;
  }
}

const f: Foo<boolean> = { boolean_parameter: true, first_parameter: 20 };
bar(f); // okay

const g: Foo<boolean> = { boolean_parameter: false, second_parameter: "20" };
bar(g); // okay

// const h: Foo<boolean> = { boolean_parameter: true, second_parameter: "3" }; // Error, Object literal may only specify known properties, and 'second_parameter' does not exist in type 'TrueBoolean'
// const i: Foo<boolean> = { boolean_parameter: false, first_parameter: 3 }; // Error, Object literal may only specify known properties, and 'first_parameter' does not exist in type 'FalseBoolean'
  • Related