typescript - Desestructuración de objetos en TS con y sin variable explícita
En TS, este código se compila con éxito...
let amir = {email: '[email ', admin: true}
function sendEmail({email}: {email: string}): string {
return `Emailing ${email}`
}
sendEmail(amir)
Sin embargo, este código,
function extractEmail({email}: {email: string}): string {
return `Emailing ${email}`
}
extractEmail({email: '[email ', user: 'admin'})
lanza error:
Argument of type '{ email: string; user: string; }' is not assignable to parameter of type '{ email: string; }'.
Object literal may only specify known properties, and 'user' does not exist in type '{ email: string; }'.(2345)
¿Cómo hace que el código sea diferente declarar explícitamente el objeto en un let?
Respuesta #1
Como mencionó @Countingstuff, el Manual de TypeScript explica el razonamiento, pero no menciona un punto clave: si pasas un objeto literal con propiedades excedentes a una función, no hay manera de acceder a esas propiedades en ningún lugar, por lo que tiene sentido marcarlas como errores. Si el código a continuación fuera válido, la propiedad x siempre sería inútil:
f({a: 1, x: true})
function f(a: {a: number}) {
console.log(a.x) // cannot access `x` here
}
// cannot access `x` here either
Lo mismo sucede al asignar un objeto literal a una variable o constante con un tipo más específico:
const a: {a: number} = {a: 1, x: true}
console.log(a.x) // cannot access `x`
Sin embargo, si primero asignas el literal a una variable o constante, ya no es necesariamente un error:
const o = {a: 1, x: true}
function f(a: {a: number}) {
console.log(a.x) // still cannot access `x` here
}
console.log(o.x) // but here we can
Y de manera similar para una asignación a un tipo más restringido:
const o = {a: 1, x: true}
const a: {a: number} = o
console.log(o.x)
