Вы не можете этого сделать, потому что Base
теряет информацию о том, что ему было назначено, когда вы явно набираете его как IObject
. Это не тот случай, когда Base
будет иметь подпись индекса и имен свойств в своем типе. Тип Base
- IObject
, который является сигнатурой индекса и ничего более.
Полагаю, вы хотите ограничить Base
наличием только числовых свойств, но вы хотите захватить фактический тип литерала объекта, который вы ему назначаете. Переменные сами по себе не могут этого сделать, вам нужно использовать дополнительную функцию. Функции могут иметь параметры типа, которые ограничены, но выводятся на основе фактических аргументов.
interface IObject {
[K: string]: number;
}
function createObject<T extends IObject>(o: T) {
return o;
}
const base = createObject({
title: 0,
age: 3
});
type StringValue<T> = { [K in keyof T]: string }; // <-- How to remove object index
const child: StringValue<typeof base> = {
test: "", // <-- error
title: '', // <-- this is OK
age: ""
};