microsoft / microsoft/TypeScript
5.6 regression: Incorrect param type inference for type with all optional props
Open
Nobody has claimed this yet.
Bug
Domain: check: Type Inference
Help Wanted
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
🔎 Search Terms
inference, param
🕗 Version & Regression Information
- This changed between versions 5.5.4 and 5.6.0
⏯ Playground Link
💻 Code
interface SomeType {
// On 5.6.0, experiment by making this prop required.
uniqueProp?: string;
}
declare const obs: Observable<SomeType>;
function argGetsWrongType(): Observable<{}> {
return obs.pipe(tap(arg => {
arg;
//^?
// Expected: SomeType in 5.5.4
// Actual: {} in v5.6.0-beta to 5.6.0-dev.20240816 (at least)
}));
}
function argGetsCorrectType() {
return obs.pipe(tap(arg => {
arg;
//^?
// Always correct
}));
}
interface Observable<T> {
pipe<A>(op: OperatorFunction<T, A>): Observable<A>;
}
interface UnaryFunction<T, R> { (source: T): R; }
interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> { }
interface MonoTypeOperatorFunction<T> extends OperatorFunction<T, T> { }
declare function tap<T>(next: (value: T) => void): MonoTypeOperatorFunction<T>;
🙁 Actual behavior
arg is inferred as {}
🙂 Expected behavior
arg is inferred as SomeType as was consistent in v5.5.4
Additional information about the issue
(Google note: See http://cl/664889390 for local workaround)
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
Start with the linked TypeScript Playground and compare the reproduction between 5.5.4 and 5.6.0. Trace the generic inference involved in the two pipe/tap calls, then verify that the callback parameter is inferred as SomeType when all its properties are optional while the existing control case remains correct.
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