Closed
Description
Bug Report
🔎 Search Terms
index type, indexed access type, index access operator, extends, Exclude, conditional type
🕗 Version & Regression Information
This is the behavior in every version I tried (3.3.3 to 4.3.2), and I reviewed the FAQ for entries about indexed access types.
⏯ Playground Link
Playground link with relevant code
💻 Code
interface A {
details1?: {y:string};
details2?: {x:string};
}
function create<PropName extends keyof A>(
name: PropName , a: A): Exclude<A[PropName], undefined> {
const x: A[PropName] = a[name];
if (x) return x; // Type error: Type 'A[PropName]' is not assignable to type 'Exclude<A[PropName], undefined>'.
throw new Error();
}
🙁 Actual behavior
TypeScript complains that x
in if (x) return x;
is of type 'A[PropName]' and is not assignable to type 'Exclude<A[PropName], undefined>', because it assumes that x
can be undefined.
🙂 Expected behavior
I would have expected that this works, as return x
is the consequence of the conditional if (x)
, so x
cannot be undefined
.
Thanks for taking the time to look at this!
Metadata
Metadata
Assignees
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
RyanCavanaugh commentedon Jun 2, 2021
Duplicate #31908 & others. We'd need, at a minimum, #22348 to be able to model this correctly.
sigurdschneider commentedon Jun 2, 2021
Too bad, thanks for taking a look.
typescript-bot commentedon Jun 4, 2021
This issue has been marked as a 'Duplicate' and has seen no recent activity. It has been automatically closed for house-keeping purposes.