Búsqueda de sitios web

typescript - Función que extiende un objeto con propiedades de tipo any vs unknown


En las definiciones de tipos siguientes, ¿por qué P1 y P2 tienen valores diferentes?

type P1 = (() => 22) extends {[k:string]:any} ? 1:2 //`P1 == 1`
type P2 = (() => 22) extends {[k:string]:unknown} ? 1:2 //`P2 == 2`

Respuesta #1

Vea el Cambio Importante: { [k: string]: unknown } ya no es un objetivo de asignación comodín para una respuesta autorizada.

La firma de índice {[k: string]: any} se comporta de manera especial en Typescript: es un objetivo de asignación válido para cualquier tipo de objeto. Normalmente, tipos como () => 22 no reciben firmas de índice implícitas, por lo que es un error asignar () => 22 a {[k: string]: unknown}. Solo cuando el tipo de propiedad es any se obtiene el comportamiento permisivo especial:

let anyRec: { [k: string]: any };
anyRec = () => 22; // okay

let unkRec: { [k: string]: unknown };
unkRec = () => 22; // error

Así que por eso P1 y P2 son diferentes.

Enlace de Playground al código

Artículos relacionados