Я пытаюсь создать относительно простой тип, который будет обеспечивать ссылку на ключ вложенного объекта на внешний уровень.
Чтобы немного прояснить ситуацию, вот пример:
const obj = {
foo: {
name: 'bar',
ref: 'foo' // < this should reference the key of the parent
}
}
Это, очевидно, не будет проблемой в статическом типе объекта, где нам нужно только проверить 'foo'
, но я пытаюсь убедиться, что он динамический с аргументами универсального типа.
Я пробовал следующее:
type InnerObject<K> = {
name: string,
ref: K,
}
type OuterObject<T, K extends keyof T> = {
[key in K]: InnerObject<K>
}
Это работает почти нормально, обеспечивая проверку типов для объединения текущих ключей:
Проблема в том, что он также позволяет передавать другой ключ объекта в свойство ref
, когда это явно не следует.
Я думал о том, чтобы каким-то образом создать универсальный тип третьего типа и передать его в Exclude
служебный тип, т.е.
type InnerObject<T, K extends keyof T, CurrentKey> = {
name: string,
ref: Exclude<CurrentKey, K>
}
но проблема в том, что я не могу придумать способ передачи текущего ключа индексированного объекта без написания явной функции редуктора/карты для внешнего объекта.
Возможно ли это, или это просто невозможно в typescript ?
Here's link to the playground in question.