Búsqueda de sitios web

¿Cómo defines un arreglo de Partials en TypeScript?


Por ejemplo,

type User = {
  first_name: string,
  last_name: string,
  notes: string
}

¿Cuál de los siguientes funcionaría?

const users:Partial<User>[] = [{first_name: "Name"}]; // A

const users:Partial<User[]> = [{first_name: "Name"}]; // B

const users:[Partial<User>] = [{first_name: "Name"}]; // C

Extrañamente, todos estos parecen ser TypeScript válido en tiempo de compilación.

Gracias de antemano.

Respuesta #1

La manera adecuada es

const users:Partial<User>[] = [{first_name: "Name"}];

Partial<User[]> significa que tiene algunas de las propiedades de Array.

[Partial<User>] significa que es un arreglo de User parcial con 1 elemento.

Curiosamente, todos estos parecen ser TypeScript válido en tiempo de compilación

La sintaxis es válida pero los tipos no lo son. Se espera que Partial<User[]> cause un error porque los tipos son incompatibles.

Respuesta #2

Aunque todos resultan ser similares en JavaScript compilado, hay una gran diferencia en los tres.

const users:Partial<User>[] = [{first_name: "Name"}];

Este es un array válido de Partial. Al agregar [] al final, estás especificando que la longitud es desconocida y puede ser cualquiera. Así que puedes tener tantos elementos de User en este array como quieras. Recuerda esto ya que te ayudará con el siguiente ejemplo.

En el segundo ejemplo, estás tratando de hacer lo mismo, pero es diferente e inválido.

const users:Partial<User[]> = [{first_name: "Name"}];

Estás intentando convertir un array de User en Partial. Entonces, User todavía no es parcial, pero estás intentando convertir el array en parcial. Obtienes un error:

Type '{ first_name: string; }[]' is not assignable to type 'Partial<User[]>'.
  Types of property 'pop' are incompatible.
    Type '() => { first_name: string; }' is not assignable to type '() => User'.
      Type '{ first_name: string; }' is not assignable to type 'User'.
        Property 'last_name' is missing in type '{ first_name: string; }'.

En tu tercer ejemplo:

const users: [Partial<User>] = [{ first_name: "Name" }]; // C

Estás haciendo lo mismo que en tu primer ejemplo y es válido. Creando un arreglo de Partial pero hay una diferencia. Aquí, solo puedes tener un elemento en este arreglo. Si intentas agregar otro elemento, obtendrás un error porque con [Partial<User>] también se especifica que la longitud del arreglo será exactamente 1.

Veamos, ¿cuál es el error en lo siguiente:

const users: [Partial<User>] =    [{ first_name: "Name" }, { first_name: "Name" }];

Aquí el error es:

    Type '[{ first_name: string; }, { first_name: string; }]' is not assignable to type '[Partial<User>]'.
  Types of property 'length' are incompatible.
    Type '2' is not assignable to type '1'.

Extrañamente, TypeScript compila todos tus ejemplos en un arreglo similar, pero sí te da errores en su compilador en línea.

Hay una herramienta en línea de TypeScript para jugar y ver tu código convirtiéndose en JavaScript. https://www.typescriptlang.org/play/ Lo bueno es que en realidad puedes ver el problema con tu código en la sección de código de TypeScript. Cualquier problema con el código tendrá un subrayado rojo y puedes pasar el cursor sobre él para ver los detalles.

Artículos relacionados