Как удалить индекс из объекта typeof в машинописи - PullRequest
0 голосов
/ 23 января 2019

с использованием [key: string] заставит мой тип принимать любой ключ.Я пытаюсь избежать этого, потому что в каком-то месте я переопределяю типы для свойства.Подумайте о следующем.

interface IObject {
  [K: string]: number;
}

const base: IObject = {
  title: 0,
  age: 3
};
type StringValue<T> = { [K in keyof T]: string };  // <-- How to remove object index


const child: StringValue<typeof base> = {
  test: "" // <-- should not be possible
  title: '' // <-- this is OK
};

1 Ответ

0 голосов
/ 23 января 2019

Вы не можете этого сделать, потому что 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: ""
};
...