Используйте тип из индекса в дочерних типах - PullRequest
0 голосов
/ 03 мая 2020

У меня есть куча данных, которые встроены в литерал объекта. Ключи этого объекта также существуют в каждом из дочерних объектов этого объекта, и я хотел бы применить это с помощью машинописи:

type People = {[NAME in string]: { name: NAME; age: number }};

const people: People = {
    Jeff: { name: "Jeff", age: 30 },
    Fred: { name: "Freddy", age: 25 }, // no error, name evaluates to string
    Sally: { name: "Sally", age: 35 },
};

В прошлом я делал подобные вещи, используя строковые объединения:

type People = {[NAME in "Jeff" | "Fred" | "Sally"]: { name: NAME; age: number }};

const people: People = {
    Jeff: { name: "Jeff", age: 30 },
    Fred: { name: "Freddy", age: 25 }, // ERROR: Type '"Freddy"' is not assignable to type '"Fred"'.  ts(2322)
    Sally: { name: "Sally", age: 35 },
};

Но для моего текущего варианта использования поддержание отдельного типа объединения в дополнение к объекту было бы чрезмерным.

Можно ли использовать тип ключа из индексированного объекта в дети этого объекта?

1 Ответ

1 голос
/ 03 мая 2020

Лучшее, что я могу сделать, это так:

type People<T> = { [K in keyof T]: { name: K; age: number } };

function createPeople<T extends People<T>>(people: T): People<T> {
    return people;
}

const people = createPeople({
    Jeff: { name: 'Jeff', age: 30 },
    Fred: { name: 'Freddy', age: 25 }, // ERROR: Type '"Freddy"' is not assignable to type '"Fred"'.  ts(2322)
    Sally: { name: 'Sally', age: 35 },
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...