Zjednodušení strojopis typy uvnitř typu popup

0

Otázka

Je možné zjednodušit typ, který je zobrazen v typu popisku, který je viditelný, když jsem se vznášet se nad proměnnou, na psacím Stroji?

Mám následující kód:

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;

Když jsem se vznášet se nad result proměnné jsem si: [hovering over result variable 1

Nicméně, když jsem se vznášet se nad type X Vidím, že: hovering over a typeof result

Otázky:

  1. Proč jsou tyto typy zobrazena jinak? (I když oni představují to samé)
  2. Je tam způsob, jak ukázat typu, jako je to znázorněno na druhé obrazovce?

dětské hřiště

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

Nejlepší odpověď

1

Mohli byste udělat něco jako:

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

V podstatě to dělá to samé, jako to, co děláš, ale ve více kolem.

Místo spoléhání se na & parametr, který bude znečišťovat hover nápověda. Můžete efektivně obnovit celý objekt od nuly.

Toho je dosaženo pomocí k in K | keyof Acc jako klíč, ale to také znamená, že budete potřebovat podmíněné typ pro hodnotu.

Jsem si to představit, možná méně výkonný, ale upřímně, nemyslím si, že to bude největší rozdíl.

Dětské hřiště

2021-11-24 03:11:45
0

To je základní rozdíl mezi type klíčové slovo a interface klíčové slovo. Názvy rozhraní se objeví v popisky, ale názvy typu nemají.

2021-11-24 03:36:18
0

Zdá se, že je možné vytvořit nástroj, typ, který bude dělat zploštění automaticky. Takže, není třeba pitvat zadejte způsob, @zecuria udělal.

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 je ukraden z tu

2021-11-28 15:00:21

V jiných jazycích

Tato stránka je v jiných jazycích

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