Búsqueda de sitios web

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)