Tengo una clase abstracta que se ve así:
// step.ts import { AllowedStepNames } from "./interfaces"; abstract class Step { abstract nextStep(): AllowedStepNames | undefined }Que a su vez usa un tipo en un archivo separado:
// interfaces/index.ts const stepList = { foo: "bar", bar: "baz" }; export type AllowedStepNames = keyof typeof stepList;Tengo una clase que se extiende desde ella que se ve así:
// referral-reason.step.ts export default class ReferralReasonStep extends Step { nextStep() { return this.params.reason === 'no-reason' ? 'foo' : undefined } }Sin embargo, el compilador arroja un error:
Property 'nextStep' in type 'NotEligibleStep' is not assignable to the same property in base type 'Step'.Sin embargo, si agrego el tipo de retorno en mi clase heredada así:
export default class ReferralReasonStep extends Step { nextStep(): AllowedStepNames | undefined { return this.params.reason === 'no-reason' ? 'foo' : undefined } }Esto me parece extraño, porque esperaría que la clase extendida herede el tipo de retorno de la clase abstracta. ¿Alguien puede decirme qué está pasando? ¿O estoy haciendo algo mal?
Además, si pongo todas mis clases y tipos en el mismo archivo, el problema desaparece.
Creo que tengo el problema ahora:
TypeScript infiere automáticamente la string de tipo en lugar de foo | undefined a su función según el tipo de retorno y la string no se puede asignar a la unión AllowedStepNames .
¿Qué puedes hacer para arreglar esto?
Como ya dijiste en la publicación, puedes establecer explícitamente el tipo de retorno de la función en foo | undefined
La razón por la que no hubo ningún error en el área de juegos de TypeScript es una diferencia en las reglas de tsconfig. Identifiqué a strictNullChecks como la regla que cambia este comportamiento. Entonces, dependiendo de su proyecto, puede habilitar esta regla.
compilerOptions: { strictNullChecks: "true" } Al usar as const , puede decirle al compilador que use el valor literal de cadena como tipo en lugar de string .
nextStep() { return this.params.reason === "no-reason" ? "foo" as const : undefined; }