Typescript泛型:给定键K和对象T,约束T[K]的类型
我有一个环境,其中某些具有Typescript泛型:给定键K和对象T,约束T[K]的类型,typescript,generics,typescript-generics,Typescript,Generics,Typescript Generics,我有一个环境,其中某些具有id属性的对象每“勾选”一次就过期,需要使用getObjectById调用。我想实现一个setter方法,通过映射thing.property=>getObjectById(thing.property.id)来刷新某物的属性。理想情况下,我希望此方法获取一个对象T和一个键K,其中T[K]可以是一个具有id(HasID)或它们的数组(HasID[])的对象 我相信我已经接近一个解决方案,但它还不完全正确。下面列出了我目前拥有的(一个名为$的类上的静态方法): 有人能给我
id
属性的对象每“勾选”一次就过期,需要使用getObjectById
调用。我想实现一个setter方法,通过映射thing.property=>getObjectById(thing.property.id)
来刷新某物的属性。理想情况下,我希望此方法获取一个对象T
和一个键K
,其中T[K]
可以是一个具有id(HasID
)或它们的数组(HasID[]
)的对象
我相信我已经接近一个解决方案,但它还不完全正确。下面列出了我目前拥有的(一个名为$
的类上的静态方法):
有人能给我指出正确的方向来正确约束
T[K]
的类型吗 你很接近,问题是不是T
的每个键都必须是HasID
或HasID[]
,只有K
class $ {
static refresh<T extends { [P in K]: HasID }, K extends string>(thing: T, key: K): void;
static refresh<T extends { [P in K]: HasID[] }, K extends string>(thing: T, key: K): void;
static refresh<T extends { [P in K]: HasID | HasID[] }, K extends string>(thing: T, key: K): void {
}
}
let 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
$.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
class $ {
static refresh<T extends { [P in K]: HasID }, K extends string>(thing: T, key: K): void;
static refresh<T extends { [P in K]: HasID[] }, K extends string>(thing: T, key: K): void;
static refresh<T extends { [P in K]: HasID | HasID[] }, K extends string>(thing: T, key: K): void {
}
}
let 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
class $ {
static refresh<T extends Record<K, HasID>, K extends string>(thing: T, key: K): void;
static refresh<T extends Record<K, HasID>[], K extends string>(thing: T, key: K): void;
static refresh<T extends Record<K, HasID | HasID[]>, K extends string>(thing: T, key: K): void {
}
}