Búsqueda de sitios web

typescript - ¿Por qué `T extends "A"` y `S extends "A"` no tienen superposición?


Estoy confundido con un error de compilación de TypeScript sobre el siguiente código:

function f<T extends "A", S extends "A">(x: T, y: S) {
  if (x === y) {
     // ERROR: This condition will always return 'false' since the types 'T' and 'S' have no overlap. ts(2367)
  }
}

parque infantil

Obviamente, T y S podrían tener superposición, pero el compilador dice que no tienen superposición. ¿Por qué sucede esto y cómo resolver este error?

Respuesta #1

Supongo que este comentario de RyanCavanaugh también se aplica a tu caso:

=== solo está permitido entre dos operandos si existe una relación de tipo "comparable" entre ellos. Esto es similar a la verificación que determina si una afirmación de tipo es legal, con algunos casos especiales adicionales.

Para ver un error más significativo del compilador, intente una conversión:

function f<T extends "A", S extends "A">(x: T, y: S) {
  /**
   * Conversion of type 'T' to type 'S' may be a mistake 
   * because neither type sufficiently overlaps with the other. 
   * If this was intentional, convert the expression to 'unknown' first.
   * 
   * 'T' is assignable to the constraint of type 'S',
   * but 'S' could be instantiated with a different subtype of constraint '"A"'.
   */  
  const a = x as S;
}

Para hacer feliz al compilador, puedes convertir a unknown o any.

  if (x as unknown === y) {
    return true;
  }

Parque infantil

Respuesta #2

Todavía no estoy seguro de si te entiendo bien. Pero tal vez esto podría ayudarte

type T = `${'A' | 'B'}-${string}`;

function isName(x: T, y: T, name: string): `${T}#${T}` {
    if (x === y) { // no errors here
    }
    return 'A-first#B-second'; // valid
    return 'A-first#C-second'; // is not valid
}