Colección de citas famosas - Colección de poesías - Preguntas de entrevista anidadas en bucle del diccionario

Preguntas de entrevista anidadas en bucle del diccionario

¿Hasta qué nivel puedes responder una pregunta de una entrevista mecanografiada de nivel 3?

Este problema tiene tres niveles. Veámoslo uno por uno.

Los requisitos para el primer nivel son los siguientes:

Implementar una función zip para fusionar los elementos de dos matrices en orden, por ejemplo, al ingresar, devuelve,,]

Esta capa toma un elemento de las dos matrices a la vez, lo fusiona y lo coloca en la matriz, y luego continúa procesando el siguiente elemento y realiza este proceso de forma recursiva hasta que la matriz esté vacía.

funciónzip(? destino, fuente)? {

¿Si (!target.length ||!source.length)? return【】;

const【uno,...descanso 1】= objetivo;

const【otro,...descanso 2】= fuente;

Return [[one, another],...zip (rest 1, rest 2)];}

El resultado es correcto.

También hay dos tipos: declaración de función directa del tipo de función y declaración de interfaz del tipo de función y luego agregarla al tipo de variable.

Debido a que se desconoce el tipo de elemento específico, utilizamos desconocido.

Aquí puedes preguntar la diferencia entre cualquiera y desconocido:

Cualquiera y desconocido puede recibir cualquier tipo:

Pero cualquiera puede asignarse a cualquier tipo, mientras que desconocido no puede.

Esto sólo se utiliza para recibir otros tipos, por lo que desconocido es más adecuado y seguro que cualquier tipo.

Este nivel también es de sintaxis ts relativamente básica, y el tercer nivel es más difícil:

Utilice la programación de tipos para lograr indicaciones de tipo precisas, como parámetros entrantes y valores de retorno que debe solicitarse. Type,,]

Se requiere que el tipo de valor de retorno sea preciso, por lo que debemos generar dinámicamente el tipo de valor de retorno según el tipo del parámetro.

Eso es todo:

Declare dos parámetros de tipo Destino y Fuente, y la restricción es desconocida [], que es un tipo de matriz de cualquier tipo de elemento.

Estos dos tipos de parámetros son los tipos de los dos parámetros pasados.

El valor de retorno lo calcula Zip.

Luego necesitamos implementar un tipo avanzado de Zip:

Los parámetros de tipo pasados ​​son dos tipos de matriz, y también necesitamos extraer cada elemento de ellos y fusionarlos.

Los elementos se pueden extraer mediante coincidencia de patrones:

Así, este tipo se puede definir de la siguiente manera:

typeZip lt a? extendsunknown【】,¿Otro? extendsunknown【】》;=

A? Extensión [Primero inferir uno,...inferir Rest1]

¿Otros? Extensión [Inferir otros primero,...Inferir los 2 restantes]

[[OneFirst, OtherFirst],...Zip ltRest1, Rest2》]

: []

: [];

Extraiga los primeros elementos de las dos matrices respectivamente para construir una nueva matriz. Luego haga esto de forma recursiva para el resto de la matriz hasta que la matriz esté vacía.

Esto implementa el tipo de alto nivel que queremos:

Pero si lo agregamos como valor de retorno a la función, ocurrirá un error:

Porque cuando Cuando declaras una función, no sabes cuáles son los parámetros, por lo que, naturalmente, no puedes calcular ZIP

Entonces, ¿qué debemos hacer?

Se puede resolver mediante la sobrecarga de funciones:

Ts admite la sobrecarga de funciones. Puede escribir la definición de tipo de múltiples funciones con el mismo nombre y, finalmente, escribir la implementación de la función. de modo que cuando se utiliza esta función, el tipo de función coincide según el tipo de parámetro.

Nuestras funciones programadas usando tipos no reportarán errores si se escriben de esta manera.

Usémoslo para ver:

¿Por qué el valor de retorno es del tipo incorrecto?

De hecho, el tipo de función coincidente en este momento es correcto, pero no es un tipo literal.

En este punto puedes agregar un as const.

Pero agregar como constante inferirá solo lectura

Entonces los tipos no coinciden, así que agregue solo lectura en la declaración del parámetro de tipo:

Pero el tipo de La función zip no coincide.

¿Quieres agregar solo lectura a todos los lugares donde se usa este tipo?

No, ¿por qué no eliminamos la modificación a solo lectura?

El tipo tiene un tipo de solo lectura avanzado incorporado:

Cada índice del tipo de índice se puede modificar con solo lectura:

Pero no proporciona eliminando el tipo de modificación avanzada de sólo lectura. Podemos implementarlo nosotros mismos:

Construya un nuevo tipo de índice usando la sintaxis del tipo de mapeo. Agregar -readonly significa eliminar la modificación de solo lectura.

Algunos estudiantes pueden preguntar: ¿el tipo de matriz también es un tipo de índice?

Sin embargo, los tipos indexados son tipos que agregan múltiples elementos, al igual que los objetos, matrices y clases.

Por lo tanto, es natural usarlo en una matriz:

(Para ser precisos, se llama tupla, una matriz con un número fijo de elementos).

Entonces todo lo que tenemos que hacer es usar Mutable para eliminar el modo de solo lectura antes de pasar el archivo Zip:

Inténtalo de nuevo:

¡Ya terminaste! El tipo de valor de retorno ahora es correcto.

Pero todavía hay un problema. Si el literal no se pasa directamente, no se puede deducir el tipo del literal, lo que parece incorrecto en este momento:

¿Pero no declaramos todos tipos sobrecargados?

Si no puedes inferir el tipo literal, debes hacer coincidir así:

Pero en realidad coincide con el primero:

En este punto, es en realidad solo es necesario cambiar el orden de los siguientes dos tipos de funciones:

En este punto, la situación con los parámetros literales sigue siendo correcta:

¿Por qué?

¿Por qué? Los tipos de funciones sobrecargadas coinciden de arriba a abajo. Siempre que haya una coincidencia, se aplicará.

En el caso de cantidades no literales, el tipo es número[], que puede coincidir con el tipo de desconocido[] para que el tipo de función sea efectivo.

En el caso de una gran cantidad de texto, se infiere que solo lectura y solo lectura no coincide con desconocido[]. Si continúa haciendo coincidir hacia abajo, hará que el tipo de función coincida con el parámetro de tipo.

En ambos casos se aplica el tipo de función adecuado.

El código completo tiene este aspecto:

typeZip lt one? extendsunknown【】,¿Otro? extendsunknown【】》;=uno? Extensión [

Primero inferir uno,

...Inferir Rest1

]

¿Otros? Extensión [Inferir otros primero,...Inferir los 2 restantes]

[[OneFirst, OtherFirst],...Zip ltRest1, Rest2》]

: []

: [];

Escriba variable ltObj gt= {

-solo lectura[¿Clave? en clave de Obj】:Obj【Clave】;

};

funciónzip (? destino: desconocido [], fuente: desconocido []):? desconocido【】? ;

funciónziplt? Targetextendsreadonlyunknown【】,? sourceextendsreadonlyunknown【】 gt (

destino: destino,

fuente: fuente

):?Zip lt? ¿variable? objetivo gt, ?variable lt? Fuente gt gt;

funciónzip (? destino: desconocido [], fuente: desconocido [])? {

¿Si (!target.length ||!source.length)? return【】;

const【uno,...descanso 1】= objetivo;

const【otro,...descanso 2】= fuente;

Return [[uno, otro],...zip(resto 1,resto 2)];

}

constresult = zip([?1,?2,?3 ]?Asconst, [? 4,? 5,? 6]? 1,?2,?3];

constarr2 =[? 4,?'5',?6];

const result 2 = zip(arr 1, arr 2);

Resumen

Hoy lo hacemos Una pregunta de entrevista ts integral, que tiene tres niveles:

El primer nivel implementa la lógica de js, que se puede lograr mediante recursividad o bucle.

La segunda capa agrega tipos a la función y usa la función para declarar el tipo y la interfaz para declarar el tipo de función. Tanto los parámetros como el valor de retorno son desconocidos 【】.

El tercer nivel consiste en utilizar la programación de tipos para lograr sugerencias de tipos precisas. Esta capa necesita obtener los tipos de parámetros y devolverlos extrayendo los tipos de elementos y construyendo un nuevo tipo de matriz. También debes declarar tipos mediante la sobrecarga de funciones, prestando atención al orden en que se declaran los tipos sobrecargados.

Debido a que const puede hacer que un literal infiera el tipo literal, pero estará decorado con solo lectura, puedes escribir tu propio tipo mapeado para eliminar esta decoración.

De hecho, este es también el orden en el que aprendemos ts. Primero debemos poder escribir lógica js, luego saber cómo agregar tipos ts a funciones y clases, y luego aprender programación de tipos y saber cómo generar tipos dinámicamente.

Entre ellos, la programación de tipos es la parte más difícil de ts y la más poderosa. Después de conquistar este nivel, se puede decir que tiene cierta comprensión.