microsoft / microsoft/TypeScript
Assertion function methods complains about missing annotation even with explicit annotation
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 2d 4h
- Merged PRs (30d)
- 132
Description
This may be working as intended but the error message is at least unclear for this case. It's not obvious why explicit annotation with a Union is different than explicit annotation with a class type.
TypeScript Version: 3.9.4
Search Terms:
- assertion function union
- assertion function
Code
type Pet = Cat | Dog;
type Filter<V extends Pet, T extends 'dog' | 'cat' > = V extends { type: T } ? V : never
abstract class Base {
abstract type: 'dog' | 'cat'
assert<T extends 'dog' | 'cat'>(this: Pet, type: T): asserts this is Filter<Pet, T> {
if (this.type === type) return
throw new Error('nope')
}
}
class Dog extends Base {
type = 'dog' as const
bark() { }
}
class Cat extends Base {
type = 'cat' as const
meow() { }
}
const a: Pet = new Dog() as any
const b: Dog = new Dog() as any
a.assert('dog')
a.bark()
b.assert('dog')
b.bark()
Expected behavior:
a.assert() to narrow the type and not complain about an explicit type annotation
Actual behavior:
a.asserts is marked as implicitly typed
Playground Link:
Related Issues:
#36931
#37241
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the reported behavior in the linked TypeScript Playground using the provided Pet, Base, Dog, and Cat example. Start by tracing how the compiler checks the assertion method's explicit asserts this is Filter<Pet, T> annotation, then compare it with the class-type case. Done means the union annotation is handled consistently or the diagnostic clearly explains why it is rejected, with regression coverage added in the relevant compiler tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100