microsoft / microsoft/TypeScript
Bug: null can be excluded by !== null in flow before typeof === 'object', but not excluded by predicate function.
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
🔎 Search Terms
"null", "control flow", "narrowing", "narrow", "exclusion", "object", "typeof"
🕗 Version & Regression Information
Potentially, we could expect the behaviors of if (a === null) and if ((v => v !== null)(a)) (inferred as predicate since TS 5.5) should be the same, but it's actually not in specific cases.
If it's combined with typeof a === 'object' check in the same flow, first one is correctly omits the null possibility, while second one doesn't.
- This changed between versions:
- I confirmed that the exclusion in flow can be done since TS4.5. It's not regression, but the new feature seems to have been partially applied.
- TS4.4 https://www.typescriptlang.org/play/?ts=4.4.4#code/MYewdgzgLgBAlhAcgVwDapgXhgCgG4BcMyYA1mCAO5gCURe8EMYaGmAfDA5j86wNwAoAPTCY4mAD0A-INCRYAMyy4AhkRLkqtLJwDegifGU4EKdDlU0aMAE4BTKMltghRuCagBPAA72QyqowAIS8AOQgAEYAVvbAUGE2Dk4ubhKqbqJSsgC+QoJy4NAwAOYqlhpkFNQ2HDAG7iZBPNgs6EmOzq6GEh643n4BMEGh2BExcQkdKd1GGYZZMoJ5QA
- TS4.5 https://www.typescriptlang.org/play/?ts=4.5.5#code/MYewdgzgLgBAlhAcgVwDapgXhgCgG4BcMyYA1mCAO5gCURe8EMYaGmAfDA5j86wNwAoAPTCY4mAD0A-INCRYAMyy4AhkRLkqtLJwDegifGU4EKdDlU0aMAE4BTKMltghRuCagBPAA72QyqowAIS8AOQgAEYAVvbAUGE2Dk4ubhKqbqJSsgC+QoJy4NAwAOYqlhpkFNQ2HDAG7iZBPNgs6EmOzq6GEh643n4BMEGh2BExcQkdKd1GGYZZMoJ5QA
- This changed in commit or PR (not sure for now, sorry)
⏯ Playground Link
💻 Code
const isNull = (v: unknown) => v === null;
// ^?
const f = (a: unknown) => {
if (isNull(a)) return;
if (typeof a !== 'object') return;
a;
// ^?
};
const g = (a: unknown) => {
if (a === null) return;
if (typeof a !== 'object') return;
a;
// ^?
};
🙁 Actual behavior
Last a in f is inferred as object | null.
🙂 Expected behavior
Last a in f would be inferred as object.
Additional information about the issue
Here is important to check typeof === 'object' after the check for null, because type narrowing step is formally, unknown → object | null → object. === null alone cannot narrow anything on unknown.
If you swap the if-statements in above, you can see both is inferred as object.
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.
Línea de trabajo
Comienza con los enlaces de TypeScript Playground y las reproducciones mínimas para f y g, comparando los tipos inferidos después de la comprobación de typeof. Sigue el estrechamiento del flujo de control y el comportamiento del predicado inferido responsables de la diferencia; se considera terminado cuando el caso del predicado estrecha a a object sin null, con cobertura de regresión para el ejemplo reportado.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100