Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript泛型:给定键K和对象T,约束T[K]的类型_Typescript_Generics_Typescript Generics - Fatal编程技术网

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 {

  }
}