Skip to content

Article: Why narrowing without a discriminant needs the 'in' operator #82

@JoshuaKGoldberg

Description

@JoshuaKGoldberg

I actually don't remember the historical reasons for this is the case, but have the rule memorized...

In general, TypeScript won't let you access properties of a value that aren't defined in all possible types the value might be. So you can't do things like:

declare const value: { a: string } | { b: string };

value.a;
//    ~
// Property 'a' does not exist on type '{ a: string; } | { b: string; }'.
//   Property 'a' does not exist on type '{ b: string; }'.

However, you can do an existence check with the in operator. That will work as a form of type narrowing:

declare const value: { a: string } | { b: string };

if ('a' in value) {
  value.a; // Ok
  // ^? { a: string }
}

https://discord.com/channels/508357248330760243/942074070860705852/1008521509532356649

Metadata

Metadata

Labels

type: articleAdding a new article .mdx file

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions