У меня есть среда, в которой определенные объекты, обладающие свойством id
, истекают каждый «тик» и должны быть вызваны с помощью getObjectById
. Я хотел бы реализовать метод установки для обновления свойства чего-либо путем сопоставления thing.property => getObjectById(thing.property.id)
. В идеале я бы хотел, чтобы этот метод брал вещь T
и ключ K
, где T[K]
может быть объектом с идентификатором (HasID
) или их массивом (HasID[]
).
Думаю, я близок к решению, но это еще не совсем правильно. То, что у меня сейчас есть, перечислено ниже (статический метод класса $
):
static refresh<T extends {[K in keyof T]: HasID}, K extends keyof T>(thing: T, key: K): void;
static refresh<T extends {[K in keyof T]: HasID[]}, K extends keyof T>(thing: T, key: K): void;
static refresh<T extends {[K in keyof T]: HasID | HasID[]}, K extends keyof T>(thing: T, key: K): void {
if (_.isArray(thing[key])) {
thing[key] = _.map(thing[key] as HasID[], s => getObjectById(s.id)) as HasID[];
} else {
thing[key] = getObjectById(thing[key].id) as HasID;
}
}
Например, желаемое поведение для foo: {bar: HasID, baz: HasID[], biz: string[]}
будет таким:
$.refresh(foo, 'bar') // foo.bar = getObjectById(foo.bar.id)
$.refresh(foo, 'baz') // foo.baz = _.map(foo.baz, x=>getObjectById(x.id))
$.refresh(foo, 'biz') // error: foo.biz is not HasID or HasID[]
$.refresh(foo, 'boo') // error: 'boo' is not a key of foo
Может ли кто-нибудь указать мне правильное направление, чтобы правильно ограничить тип T[K]
?