-
Notifications
You must be signed in to change notification settings - Fork 13.2k
Closed
Description
🔎 Search Terms
discriminator
discriminated
discriminating
catch-all
default
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about search for discriminator/discriminating
⏯ Playground Link
💻 Code
✅ Works (discriminator with default type, constant object):
type Foo = { discriminator: 'foo', value: 'foo' } | { discriminator: string, value: 'bar' };
const foo: Foo = { discriminator: 'foo', value: 'bar' };
if (foo.discriminator === 'foo') {
console.log(foo.value); // Type: 'foo'
}
✅ Works (discriminator with excluding value, cast object):
type Foo = { discriminator: 'foo', value: 'foo' } | { discriminator: 'bar', value: 'bar' };
const foo: Foo = { discriminator: 'foo', value: 'bar' } as Foo;
if (foo.discriminator === 'foo') {
console.log(foo.value); // Type: 'foo'
}
❌ Doesn't work (discriminator with default type, cast object):
type Foo = { discriminator: 'foo', value: 'foo' } | { discriminator: string, value: 'bar' };
const foo: Foo = { discriminator: 'foo', value: 'bar' } as Foo;
if (foo.discriminator === 'foo') {
console.log(foo.value); // Type: 'foo' | 'bar'
}
It looks a bit like TypeScript is missing information to narrow down the discriminator if the object type wasn't set as the constant object. But from a coder's perspective, it's Foo in all cases.
I found other issues that look related but have different examples:
- Discriminated union parameter destructuring doesn't work if the fields have defaults #50139
- Discriminated union with an optional discriminator is not being resolved as expected #58508
- Newly introduced type narrowing via discriminators on .filter does not work in this case #59654
🙁 Actual behavior
The type isn't narrowed down.
🙂 Expected behavior
The type is narrowed down to the matching discriminator.
Additional information about the issue
No response
Metadata
Metadata
Assignees
Labels
No labels