Как определить модификацию типа при выполнении функции, которая преобразует объект?

#typescript #typescript-generics

#typescript #typescript-generics

Вопрос:

Могу ли я каким-то образом поручить компилятору Typescript изменить определение типа в качестве возвращаемого значения функции, которая вызывается позже в другом месте? У меня есть несколько декораторов, которые регистрируют некоторые метаданные о свойствах класса, а затем я выполняю преобразования на основе этих метаданных:

 
class MyClass {
  @Expose({ name: 'some_property'}) <-- the name value is explicitly provided so known at compile time
  public someProperty()
}

const result = classToPlain(/* MyClass */ { someProperty: 'some-value' })
// --> I would like to have an inferred type here as simple object with { some_property: 'some-value'}
 
 // in classToPlain somewhere:
const propertyMetadatas.forEach(hander => {
  // transform the input object based on the metadata
  handler.transform(inputObject, outputObject) 
  // -> this assigns the original value from input to the `some_propety` value on the result
})
 

Я не знаком с каким-либо способом передачи изменения типа по пути. Возможно ли это как-то?

Комментарии:

1. Тьфу, декораторы. Они не меняют тип MyClass , который видит компилятор, поэтому на самом деле неверно, что значение имени «известно компилятору во время компиляции»… по крайней мере, никаким образом не связывает его MyClass . Если вас волнуют подобные вещи, я рекомендую вам отказаться от декораторов и вернуться к вызову функции (т. Е. К тому, Как реализованы декораторы) или, может быть, Даже просто добавить expose свойство к классам, которые работают таким образом.

2. Это работает для вас? Он не использует декораторы, и, несомненно, есть крайние случаи, но это общий способ, который я бы предположил, если вы хотите, чтобы TypeScript знал о типизациях. Дайте мне знать, и если это будет разумно, я напишу это как ответ. В противном случае ответ, вероятно, будет просто «нет, вы не можете этого сделать» с указателем на microsoft / TypeScript # 4881 и, в частности, этот комментарий