La simplificación de los manuscritos tipos dentro de tipo emergente

0

Pregunta

Es posible simplificar el tipo que se muestra en el tipo de descripción que es visible cuando se me pase el ratón sobre una variable en el Manuscrito?

Tengo el siguiente código:

type Debug<T> = {
    [key in keyof T]: T[key]
}

type Chainable<Acc = {}> = {
    option: <K extends string, V>(key: K, value: V) => Chainable<Acc & {[k in K]: V}>;
    get: () => Debug<Acc>;
}

declare const config: Chainable
const result = config
  .option('foo', 123)
  .option('name', 'type-challenges')
  .option('bar', { value: 'Hello World' })
  .get()


type X = typeof result;

Cuando me pase por encima result variable que obtengo: [hovering over result variable 1

Sin embargo, cuando me pase por encima type X Veo: hovering over a typeof result

Preguntas:

  1. ¿Por qué son los tipos de muestra de manera diferente? (Aunque éstos representan la misma cosa)
  2. Es allí una manera de mostrar el tipo como se muestra en la segunda pantalla?

zona de juegos infantil

types typescript
2021-11-23 22:28:22
3

Mejor respuesta

1

Se podría hacer algo como:

type Chainable<Acc = {}> = {
    option: <K extends string, V>(key: K, value: V) => Chainable<{[k in K | keyof Acc]: k extends keyof Acc ? Acc[k] : V}>;
    get: () => Debug<Acc>;
}

Básicamente esto es hacer la misma cosa, como lo que está haciendo pero de una forma más redonda sobre manera.

En lugar de confiar en & parámetro que va a contaminar el hover sugerencia. Efectivamente puede recrear la totalidad de su objeto a partir de cero.

Esto se logra mediante el uso de k in K | keyof Acc como la clave pero también significa que usted necesita un condicional del tipo para el valor.

Me imagino que esto tal vez menos eficiente, pero sinceramente yo no creo que va a hacer una gran diferencia.

Zona de juegos infantil

2021-11-24 03:11:45
0

Esta es la diferencia principal entre el type palabra clave y el interface la palabra clave. Interfaz nombres aparecen en las sugerencias, pero los nombres de tipo de no.

2021-11-24 03:36:18
0

Parece ser que es posible crear un tipo de utilidad que va a hacer el aplanamiento de forma automática. Así, no hay necesidad de diseccionar el tipo de la forma @zecuria hizo.

type Chainable<Acc = {}> = {
    option: <K extends string, V>(key: K, value: V) => Chainable<Acc & {[k in K]: V}>;
    get: () => Util_FlatType<Acc>;
}

type Util_FlatType<T> = T extends object ? { [K in keyof T]: Util_FlatType<T[K]> } : T

enter image description here

Util_FlatType es robada desde aquí

2021-11-28 15:00:21

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................