Déjame intentar explicar. Tengo la siguiente interfaz de respuesta:
interface IResponse { status: "success" | "error"; content: IMySuccessResponse | string; }¿Hay alguna forma de hacer que Typescript entienda que cuando el estado es igual a "éxito", el único valor posible del contenido será "IMySuccessResponse" y cuando el estado es igual a "error", el único valor posible del contenido será una cadena ? ?
Intenté algo así:
interface IResponse { response: { status: "success"; content: IMySuccessResponse ; } | { status: "error"; content: string; } }Pero Typescript siguió entendiendo que ambos valores de contenido son posibles independientemente del valor de estado.
EDITAR ================================================= ========
Dios mío, el problema estaba en la desestructuración. De alguna manera, la desestructuración estaba estropeando el mecanografiado, por lo que sin la desestructuración funcionó.
Como TS solo realiza verificaciones en tiempo de compilación, debe informar cuál es el valor del estado.
Lo siguiente funciona para mí:
type IMySuccessResponse = { hello: string } interface IResponse { response: { status: "success"; content: IMySuccessResponse ; } | { status: "error"; content: string; } } const response: IResponse = /* ... */; if (response.response.status === "success") { // inside this scope, the type of `content` is `IMySuccessResponse`. console.log(response.response.content.hello); } else { // in this scope, `content` is a string. console.log(response.response.content); console.log(response.response.content.hello); // this, TS complains that `content` is a string } Si verifica el valor del content , dentro del alcance de esa verificación, TS será lo suficientemente inteligente como para saber de qué tipo podría ser.