Typescript — расширение объекта с помощью универсального ключа

#typescript

Вопрос:

Мне бы хотелось, чтобы метод, который принимает объект и добавляет к нему свойство, например, это:

 const augment = <T extends {}, K extends string>(obj: T, key: K): T amp; { [x in K]: string } => {
    return { ...obj, [key]: "someString" };
};
 

Это не удается с

 Type 'T amp; { [x: string]: string; }' is not assignable to type 'T amp; { [x in K]: string; }'.
 

Я понимаю, что key это не сохраняет keyof K аспект.
В идеальном мире, если я вызываю

 const anObj = { aProp: 'aVal' };
const anotherObj = augment( anObj, "aKey" );
 

Я бы хотел, чтобы подпись anotherObj была { aProp: 'aVal', aKey: string } . В частности, когда ключевым аргументом является литерал.
Есть предложения?

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

1. Насколько вас волнует обеспечение безопасности типов TypeScript в реализации augment() ? Если вас устраивает сигнатура вызова, оставьте ее в покое и используйте утверждение внутри реализации, подобное (например) этому . Обратите внимание, что если key он имеет тип объединения, вы получаете неверные возвращаемые типы; вместо этого вам может понадобиться это , и если вы действительно хотите видеть расширенные свойства, вместо amp; этого вам может понадобиться это . Если вы хотите, чтобы что-либо из этого было расширено в ответ, дайте мне знать.