Reputation: 387
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?
Upvotes: 0
Views: 161
Reputation: 1782
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'
Upvotes: 2