Semplificando dattiloscritto tipi all'interno di tipo popup

0

Domanda

È possibile semplificare il tipo che sta per essere mostrato il tooltip che è visibile quando ho mouse sopra una variabile in Macchina?

Ho il seguente codice:

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;

Quando ho mouse sopra result variabile ottengo: [hovering over result variable 1

Tuttavia, quando ho mouse sopra type X Io vedo: hovering over a typeof result

Domande:

  1. Perché sono quei tipi mostrato in modo diverso? (Anche se rappresentano la stessa cosa)
  2. C'è un modo per mostrare il tipo di come è mostrato nel secondo schermo?

giochi

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

Migliore risposta

1

Si potrebbe fare qualcosa di simile:

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>;
}

Fondamentalmente è questo che fa la stessa cosa di ciò che si sta facendo, ma in un altro giro su strada.

Invece di basarsi su & parametro che inquina l'hover suggerimento. È in grado di ricreare l'intero oggetto da zero.

Questo è ottenuto utilizzando k in K | keyof Acc come la chiave, ma significa anche che hai bisogno di un condizionale per il tipo di valore.

Immagino che questo è forse meno performante, ma onestamente non credo che farà la differenza.

Giochi

2021-11-24 03:11:45
0

Questa è una differenza importante tra il type parole chiave e il interface parola chiave. Interfaccia nomi compaiono nelle descrizioni, ma i nomi di tipo non.

2021-11-24 03:36:18
0

Sembra che non è possibile creare un tipo di utilità che farà l'appiattimento automaticamente. Così, non c'è bisogno di sezionare il tipo di strada @zecuria fatto.

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 è stato rubato da qui

2021-11-28 15:00:21

In altre lingue

Questa pagina è in altre lingue

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