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
}
