Texto datilografado: como `aplicar` em uma estrutura que possui um registro?

Zedryas

Digamos que temos uma Estrutura segurando um registro no qual desejamos applyoutra Estrutura segurando um Registro contendo funções para as chaves da primeira Estrutura. (basicamente o reverso da Applyespecificação do Land da fantasia)

Vamos primeiro definir alguns tipos que usaremos:

type Index = string|number|symbol

type Struct<R extends Record<Index, any>> = {
  readonly value: R
  apOn: <B>(fab: Struct<{[K in keyof R]?: (a: R[K], k: K) => B}>) =>
    Struct<{[K in keyof R]: B}>
}

em seguida, aborda a própria estrutura

declare function newStruct<R extends Record<Index, any>> (value: R): Struct<R>

const struct = newStruct ({a: 1, b: true})

Os dois primeiros funcionam conforme o esperado ao especificar para o apOnargumento do método a Structcom o mesmo número de teclas que possuem funções com o mesmo tipo de retorno.

const withFuncsa = newStruct ({
  a: (a: number) => `${a}`,
  b: (a: boolean) => `${a}`,
})
const withFuncsb = newStruct ({
  a: (a: number) => a > 0,
})

const resa = struct.apOn (withFuncsa).value // as expected {a: string, b: string}
const resb = struct.apOn (withFuncsb).value // as expected {a: boolean, b: boolean}

Mas interrompe quando os tipos de retorno são diferentes:

const withFuncsc = newStruct ({
  a: (a: number) => a > 0,
  b: (a: boolean) => `${a}`,
})

const resc = struct.apOn (withFuncsc).value
// breaks cause expect all returns type of this withFuncc function to be identical
// expected {a: boolean, b: string}

Eles são uma maneira de fazê-lo funcionar com diferentes tipos de retorno?

SpencerPark

Precisamos retrabalhar a assinatura para adiar a decisão Baté que a chave que ela calcula seja conhecida.

type Struct<R extends Record<Index, any>> = {
  readonly value: R
  apOn: <F extends {[K in keyof Partial<R>]: (a: R[K], k: K) => any}>
      (fab: Struct<F>) =>  
          Struct<Omit<R, keyof F> & {[K in keyof F]: ReturnType<F[K]>}>
}

Aqui Festá o registro dos mapeadores. É importante isso, [K in keyof Partial<R>]: ...e não [K in keyof R]?: ...porque queremos garantir que o modificador opcional não seja achatado em ... | undefined. Os mapeadores estão presentes e uma função ou não.

Então, no tipo de retorno, mantemos os campos não mapeados iguais, Omit<R, keyof F>mas para todos os campos mapeados, usamos o tipo produzido pelo mapeador {[K in keyof F]: ReturnType<F[K]>},.

Os tipos intermediários parecem um pouco confusos no intellisense, mas eles fazem o trabalho:

const t: {strings: string[], bools: boolean[]} = {
    strings: [resa.a, resa.b, resc.b],
    bools: [resb.a, resb.a, resc.a],
}

Link do parque

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Há algum problema em definir como memset uma estrutura que possui uma outra estrutura com um membro ponteiro inteligente?

Texto datilografado: Como especificar o resultado de uma função que possui vários genéricos?

Como finalizar uma string que já possui um texto em C?

Como renderizar um registro no texto datilografado

Como criar uma API que retorna um booleano no texto datilografado?

Como inverter um texto em texto datilografado?

Como fazer uma nova função associada a uma estrutura que possui um membro de encerramento?

Implementando Deref em uma estrutura que possui um traço em caixa

Como deletar uma entrada de um Registro no texto datilografado, com base no Id

Como encontro a primeira estrutura em que um determinado membro possui um valor específico?

Como deletar um pattern em um arquivo que possui a mesma estrutura, mas conteúdo diferente?

Basta armazenar quaisquer dados de um objeto em uma tabela, independentemente da estrutura que ela possui?

Como posso saber se um parâmetro que possui a interface de tipo é realmente uma estrutura?

Texto datilografado - como iterar em um HTMLCollection

Rails como criar um novo registro que possui uma associação polimórfica?

Como imprimir uma lista que é um tipo em uma estrutura

Como substituir texto em arquivos por um texto que possui caracteres complicados?

Como criar uma estrutura go a partir de um objeto JSON que possui um valor de string no lugar de uma tag?

Como declarar como argumento uma função que possui uma estrutura contendo um array, cujo tamanho é determinado por argv?

Como identificar se um registro em um banco de dados possui dados em uma determinada coluna do Rails?

Como a renderização de texto da Apple desenha um glifo que uma fonte não possui?

Como faço para chamar um URL que possui um arquivo de texto, convertê-lo em uma string e exibi-lo no ionic 2?

Tipo de texto datilografado que verifica se uma determinada chave, se passada como chave para um objeto, é resolvida em uma matriz

Como registro um "Adaptador" Autofac que possui dependências?

Texto datilografado: como digitar fortemente uma função que transforma um mapa de funções em funções semelhantes com um parâmetro de tipo diferente?

Como indicar que um objeto pode não ter uma chave no texto datilografado

Como enviar dados para um mesmo objeto com base em uma chave específica no texto datilografado

Como posso tornar uma propriedade não opcional em um tipo de texto datilografado?

Como converter uma entrada redis em um tipo de texto datilografado?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo