Simplificarea script tipuri interior de tip pop-up

0

Problema

Este posibil pentru a simplifica tip care este prezentată în cele de tip tooltip care este vizibilă atunci când am hover peste o variabilă în mașina de Scris?

Am urmatorul cod:

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;

Când am hover peste result variabila I primi: [hovering over result variable 1

Cu toate acestea, atunci când am hover peste type X Văd: hovering over a typeof result

Întrebări:

  1. De ce sunt aceste tipuri afișate diferit? (Chiar dacă ele reprezintă același lucru)
  2. Există o modalitate de a arăta tipul ca este prezentată în cel de-al doilea ecran?

loc de joaca

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

Cel mai bun răspuns

1

Ai putea face ceva de genul:

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

Practic, acest lucru este de a face același lucru ca ceea ce faci, dar într-o rundă mai multe despre mod.

În loc de bazându-se pe & parametrul care va polua hover indiciu. Puteți recrea în mod eficient întregul obiect de la zero.

Acest lucru este realizat prin utilizarea k in K | keyof Acc ca o cheie, dar, de asemenea, înseamnă că ai nevoie de o condițională tip de valoare.

Îmi imaginez acest lucru poate mai puțin performante, dar sincer nu cred că va face diferența.

Loc de joaca

2021-11-24 03:11:45
0

Aceasta este diferența principală între type cuvinte cheie și interface cuvinte cheie. Interfață nume apar în ponturile dar tipul nume nu.

2021-11-24 03:36:18
0

Se pare că este posibil să se creeze un tip de utilitate, care va face aplatizare în mod automat. Deci, nu este nevoie de a diseca tip modul @zecuria făcut-o.

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 este furat de aici

2021-11-28 15:00:21

În alte limbi

Această pagină este în alte limbi

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