Я хочу определить постоянный объект с фиксированным типом значения, а затем извлечь его ключи в отдельный тип:
interface Foo {
name: string;
}
interface MyObject {
[key: string]: Foo;
}
const myObject: MyObject = {
a: {name: 'this is a'},
b: {name: 'this is b'},
}
type Keys = keyof typeof myObject;
Этот пример в настоящее время не работает, потому что typeof myObject
разрешается в MyObject
, который имеет key
типа string
. Если я не наберу от myObject
до MyObject
, тогда он правильно разрешит Keys
до "a" | "b"
. Однако тогда он больше не будет принудительно утверждать, что все значения являются действительными экземплярами Foo
.
Могу ли я как-нибудь съесть свой пирог и поесть в без необходимости предопределять Keys
как перечисление и использование его для определения MyObject
?
Пример того, чего я хотел бы избежать:
type Keys = "a" | "b"
interface MyObject {
[key in Keys]: Foo;
}
const myObject: MyObject = {
a: {name: 'this is a'},
b: {name: 'this is b'},
}
(потому что я не хочу обновлять Keys
и myObject
каждый раз, когда я добавляю или удаляю ключ.