Simplificando transcrito tipos de dentro do tipo pop-up

0

Pergunta

É possível simplificar o tipo que está sendo mostrado, o tipo de descrição que é visível quando eu passar o mouse sobre uma variável de Máquina de escrever?

Eu tenho o seguinte 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;

Quando eu passar o mouse sobre result a variável I get: [hovering over result variable 1

No entanto, quando eu passar o mouse sobre type X Eu vejo: hovering over a typeof result

Perguntas:

  1. Por que esses tipos apresentados de forma diferente? (Mesmo que eles representam a mesma coisa)
  2. Existe uma maneira de mostrar o tipo como é mostrado na segunda tela?

parque infantil

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

Melhor resposta

1

Você poderia fazer 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>;
}

Basicamente, este está fazendo a mesma coisa como o que você está fazendo, mas em mais uma rodada sobre a forma.

Em vez de depender de & parâmetro que irão poluir o foco dica. Efetivamente, você pode recriar o objeto inteiro a partir do zero.

Isso é conseguido através de k in K | keyof Acc como a chave, mas isso também significa que você precisa de um condicional de tipo para o valor.

Eu imagino que, talvez, menos performance, mas sinceramente eu não acho que vai fazer mais diferença.

Parque infantil

2021-11-24 03:11:45
0

Esta é a principal diferença entre o type palavra-chave e o interface palavra-chave. Interface de nomes aparecem nas descrições, mas o tipo de nomes não.

2021-11-24 03:36:18
0

Parece que é possível criar um utilitário do tipo que vai fazer o achatamento automaticamente. Assim, não há necessidade de dissecar o tipo de caminho @zecuria fez.

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 é roubado aqui

2021-11-28 15:00:21

Em outros idiomas

Esta página está em outros idiomas

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