Типобезопасное сопоставление свойств объекта

#typescript

#typescript

Вопрос:

Я хочу скопировать объект и сопоставить его свойства типобезопасным способом. Я могу описать результирующий тип в TypeScript, но я не могу добиться сопоставления свойств без приведения.

Итак, рассмотрим, что у меня есть объект, который можно описать следующим образом:

 interface MyObject {
    a: number;
    b: string;
}
  

Я хочу сопоставить все его свойства. На самом деле, я могу правильно описать сопоставление с помощью TypeScript:

 type MappedObject = {[K in keyof MyObject]: {meta: string; value: MyObject[K]}};
  

Теперь я расширил все свойства MyObject . Отлично. Теперь проблема в том, что я не могу применить это преобразование безопасным для типов способом:

 const object: MyObject = {
    a: 42,
    b: 'foo',
};

const mapped = Object.fromEntries(
    Object.entries(object).map(([k, v]) => [k, {meta: 'bar', value: v}]),
);
doSomethingWithMappedObject(mapped); // error

function doSomethingWithMappedObject(mapped: MappedObject): void {
    // ...
}
  

На мой взгляд, результат Object.fromEntries(...) должен был быть совместим с MappedObject , но это не так. Как мы можем этого добиться, в идеале без приведения?