Estoy migrando a una versión más nueva de TypeScript, pero comencé a recibir este error en Type Guards.
En la rama else, la pregunta que se muestra es del tipo nunca, en lugar de la pregunta que se muestra es del tipo Pregunta. Cuando ejecuto esto en TypeScript v3.9.5, funciona bien, pero en v4.5.4 da este error. Pegando debajo de mi fragmento de código. También hay una imagen de referencia del error en el código vs.
export enum QuestionTypesEnum { TYPE1 = 'type1', TYPE2 = 'type2' } export type McqSingle = { hash: string type: QuestionTypesEnum answer: string; } export type McqMultiple = { hash: string type: QuestionTypesEnum answers: string[] } export type Question = | McqSingle | McqMultiple type EmptyQuestion = { hash: string } const isEmptyQuestion = (question: Question | EmptyQuestion): question is EmptyQuestion => { return !('type' in question) } let question: Question | EmptyQuestion = { hash: 'saas', type: QuestionTypesEnum.TYPE1 } if (isEmptyQuestion(question)) { } else { question.type // <-- Typescript complains that "Property 'type' does not exist on type 'never'" }el error es:
Typescript se queja de que "la propiedad 'tipo' no existe en el tipo 'nunca'"
El problema es que Question es un superconjunto de EmptyQuestion (las instancias de Question son instancias de EmptyQuestion válidas). Como resultado, su predicado de tipo no reduce la variable de question en absoluto; su tipo en la rama if sigue siendo Question | EmptyQuestion .
Funciona si invierte el predicado de tipo para verificar la Question , ya que aunque la Question es una pregunta EmptyQuestion válida, la pregunta EmptyQuestion no es una Question válida:
const isQuestion = (question: Question | EmptyQuestion): question is Question => { return 'type' in question; }; // ... if (isQuestion(question)) { question.type // ^? −−−− type is Question } else { question.hash // ^? −−−− type is EmptyQuestion }