TS 데사피오 - 병합

En este post vamos a intentar resolver and siguiente desafío de TypeScript: Merge Challenge

Mezclar (merge) dos tipos en un nuevo tipo. Las claves del segundo tipo sobreescribirán a las claves del primero.



Más allá de un trabalenguas lo que primero que tenemos que entender es que lo que vamos a obtener es un objecto que Representativeará a un tipo por lo que en la primera aproximación simplemente lo que haremos será indicarlo. Así si F y S dos objetos (tipos) podemos escribir algo como lo siguiente::

type Merge<F, S> = {}


다음과 같은 형식의 그래피카 포데모스를 대표합니다.

Los tipos  raw `F` endraw  and  raw `S` endraw

Ahora tenemos que mantener los atributos del primero y del segundo de los genéricos que estamos recibiendo. Esto se consigue utilizando el operador keyof . Pero, ¿cómo obtenemos los atributos de F ? Pues simplemente escribiendo algo como lo siguiente:

[P in keyof F]


TypeScript와 같은 유형의 문서를 작성하십시오.



Pero, ¿cómo añadimos los atributos de F ? Pues aquí es donde tenemos que utilizar el tipo de unión para obtener todos los atributos que hay en ambos objetos. Es más, tenemos que asignarle un valor a cada uno de estos atributos, pero como en este momento no podemos saber cuál es lo que hacemos será asignarle never porque de esta manera podemos

type Merge<F, S> = {
  [P in keyof F | keyof S]: never
}


Por lo tanto, en este punto lo que tenemos es algo como que se muestra en la siguiente figura:



Ahora simplemente tenemos que determinar el valor que se asignará al atributo en cuestión. Según el enunciado del reto si el atributo pertenece al segundo genérico entonces ese será su valor mientras que si pertenece al Primero será el del Primero y en el caso de que no sea ningunono de 104

TypeScript와 관련된 문제가 무엇입니까? Pues gracias al uso de la clausula extends ( https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#in-extends-clause ) de tal forma que, partiendo del tipo de datos que está formado por todos los atributos del segundo P (que ya sabemos) al mismo, tendremos que escribir algo como lo siguiente:

[P in keyof F | keyof S]: P extends keyof S


Es decir, hemos construido el tipo de datos que es la unión de los atributos de S y nunca y lo hemos llamado S . Ahora lo que hacemos simplemente es ver si el atributo keyof S pertenece al conjunto de atributos F .

Tipo Condicional TypeScript의 형식 스크립트에 대한 설명이 S에 의해 작성되었습니다.

¿Pero qué tenemos que hacer para mantener el tipo del atributo? Pues bien, basta con acceder a el en la tipado de P . ¿코모? Muy sencillo, utilizando el operador P . Es decir, si quieres acceder a un atributo de S escribirías algo como S . Como el atributo que pasa la condición es S simplemente accedemos a el de tipo [] . En caso de que no lo sea le asignaremos S :

type Merge<F, S> = {
  [P in keyof F | keyof S]: P extends keyof S ? S[P] : never
}


(Si el atributo está declarado en S['atributo'] para asignar su valor o en caso contrario lo que hacemos es asignarlo P at ya que por의 impetimos este proceso de repetimos este proceso pero esta vez viendo si el atributo está declarado en S para asignar su valor o en caso contrario lo que hacemos es asignarlo never Pero para que TypeScript no de errores tenemos que completar el operador condicional).

Esto nos deja el siguiente resultado para el desafío:

type Merge<F, S> = {
  [P in keyof F | keyof S]: P extends keyof S
    ? S[P] 
    : P extends keyof F
      ? F[P]
      : never
}


Ahora si vamos a ejecutar el resultado de nuestro challege para ver si tenemos errores o no veremos que todas las pruebas Mostradas pasan correctamente por lo que la solución propuesta es correcta.

Checking the solution

좋은 웹페이지 즐겨찾기