Using Type Mapping
Tipos mapeados são criados aplicando uma transformação para a propriedade de um tipo existente. O melhor caminho para entender como tipos mapeados funcioname e para criar um que processe um tipo mas não faz nenhuma mudança, como mostrado a baixo:

A propriedade name selector define o type parameter, nomeado P no exemplo e usa a keyword in para enumerar os tipos numa união de valores literais. O type union pode ser expresso diretamente como "name" | "price" ou obter usando keyof
O TSC cria uma nova propriedade no tipo mapeado para cada um dos tipos na union. O tipo de cada propriedade é determinada pelo type selector, que pode ser obtido de um source type usando o indexed access operator com o P como um tipo de valor literal para look up
O type MappedProduct usando o keyof para selecionar as propriedades definidas pela classe Product e usa o indexed type operator para obter o tipo de casa uma dessas propriedades. O resultado é equivalente a isso: