microsoft / microsoft/TypeScript
Reflect.has fails to act as type guard (should act same as "in" operator)
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
TypeScript Version: ^3.4.0-dev.20190330
Search Terms:
Reflect.has
in operator
Code
const test1 = (a: { field: number } | {}) => (("field" in a) ? a.field : 0);
const test2 = (a: { field: number } | {}) => Reflect.has(a, "field") ? a.field : 0;
Expected behavior:
Both compile successfully. "in" operator acts as a type guard per https://github.com/Microsoft/TypeScript/issues/10485. Reflect.has should act the same as "in" operator here.
We'd like to use Reflect.has a lot more and this case holds us back. Thank you!
Actual behavior:
"in" operator line compiles; Reflect.has line does not compile. Error:
allPasos.ts:445:31 - error TS2339: Property 'field' does not exist on type '{} | { field: number; }'.
Property 'field' does not exist on type '{}'.
445 Reflect.has(a, "field") ? a.field : 0;
Playground Link:
Related Issues:
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 la reproducción enlazada en Playground y compara el comportamiento existente de narrowing del operador in con Reflect.has; lee el issue relacionado #10485 para obtener contexto. Se considera terminado cuando la expresión Reflect.has mostrada compila y se comporta como espera el issue, con cobertura para la regresión.
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
- 38/100