Uproszczenie typów maszynopisu tekstu wewnątrz okna pop-up typu

0

Pytanie

Czy można uprościć typ wyświetlany w dymku typu, który pojawia się po najechaniu kursorem myszy na zmienną w Typescript?

Mam następujący kod:

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;

Kiedy нависаю nad result zmienna, którą otrzymuję: [hovering over result variable 1

Jednak, gdy najadę kursorem na type X Widzę: hovering over a typeof result

Pytania:

  1. Dlaczego te typy są wyświetlane na różne sposoby? (Nawet jeśli stanowią one jedno i to samo)
  2. Czy istnieje sposób, aby pokazać typu, jak pokazano na drugim ekranie?

plac zabaw

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

Najlepsza odpowiedź

1

Można zrobić coś takiego:

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

W istocie, jest to to samo, co i to, co robisz, ale bardziej okrężną drogą.

Zamiast polegać na & parametr, który będzie zanieczyszczać podpowiedź po najechaniu kursorem. Można skutecznie odtworzyć cały obiekt od podstaw.

Osiąga się to poprzez wykorzystanie k in K | keyof Acc jak klucz, ale oznacza to również, że potrzebny jest warunkowy typ wartości.

Przypuszczam, że może to być mniej skuteczne, ale, szczerze mówiąc, nie sądzę, że to będzie mieć największą wartość.

Plac zabaw

2021-11-24 03:11:45
0

To podstawowa różnica między type słowo kluczowe i interface słowo kluczowe. Nazwy interfejsów są wyświetlane w dymku, ale nazwy typów-nie.

2021-11-24 03:36:18
0

Wygląda na to, można utworzyć typ programu, który wykona wyrównanie automatycznie. W ten sposób, nie ma potrzeby analizować typ, jak to zrobił @zecuria.

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 skradziony stąd

2021-11-28 15:00:21

W innych językach

Ta strona jest w innych językach

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