microsoft / microsoft/TypeScript
Typescript 4.2.x - incorrectly infered generic return type of a record union (extra undefined)
@andrewbranch ya está trabajando en esto.
Desde el 4/5/2021.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 2 d 4 h
- PR fusionados (30 d)
- 132
Descripción
Bug Report
🔎 Search Terms
undefined, generic inference, typescript 4.2
🕗 Version & Regression Information
4.2.0-beta - 4.3.0-dev.20210504 (everything since 4.2 beta, including all stable releases)
NOT in 4.1.x or before
- This changed between versions 4.1.x and 4.2.x+
The return type inference of the the arrow function hasn't changed, according to the playground it was always infered as { kind: "failure"; value?: undefined; } | { kind: "success"; value: number; }. However, before 4.2. the type of the generic function above it (the andThen) was correctly narrowed down to AndThenResult<number>. This happened even without explicit type annotations, as one would expect.
In 4.2+ the undefined gets propagated into andThen<number | undefined> and this breaks the assignment (and my expectations).
⏯ Playground Link
Playground link with relevant code
💻 Code
// @strict: true
type AndThenResult<T> = { kind: 'success', value: T } | { kind: 'failure' };
function andThen<U>(
fun: (_: number) => AndThenResult<U>
) {
return fun(1)
}
// V error here, type inference gets `AndThenResult<number | undefined>` from `andThen` in TS 4.2+
const a: AndThenResult<number> = andThen(
// looks like this function infers { kind: "failure"; value?: undefined; } | { kind: "success"; value: number; } on any TS version in the playground
// however the undefined only gets propagated up in 4.2+
x => {
if (x === 1) {
return { kind: 'failure' }
}
return {
kind: 'success',
value: x
}
}
)
🙁 Actual behavior
The types don't match and the code doesn't compile. The return type of andThen(fn) is different than that expected on a.
🙂 Expected behavior
The types do match, the function return type is narrowed to AndThenResult<number> and nothing breaks.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Evaluación
Este issue todavía no se ha evaluado.