如何在typescript中接收每个记录成员的类型?

如何在typescript中接收每个记录成员的类型?,typescript,typescript-typings,Typescript,Typescript Typings,我用谷歌搜索答案,但仍然没有找到。 所以,我必须把它贴在这里 问题很简单: 假设我有任何抽象类的记录 const record = Record<string, Model> 然后我将我的模型存储在我的记录中: record.classA = new A(); record.classB = new B(); 正如我们所看到的,我的记录中的属性是动态的 所以,问题是:有可能得到我模型中每个键和所有键的类型吗 例如,我想要这样的东西: function get(key: strin

我用谷歌搜索答案,但仍然没有找到。 所以,我必须把它贴在这里

问题很简单:

假设我有任何抽象类的记录

const record = Record<string, Model>
然后我将我的模型存储在我的记录中:

record.classA = new A();
record.classB = new B();
正如我们所看到的,我的记录中的属性是动态的

所以,问题是:有可能得到我模型中每个键和所有键的类型吗

例如,我想要这样的东西:

function get(key: string) {
  return record[key]; //Here I expect to receive a correct type (for example class A or class B regarding the key)
}
另一个问题是,当我在“记录”之后按enter键时,是否可能获取所有现有的键

我读过关于函数重载的文章,但这可能是另一种解决方案,或者我可以动态重载我的函数吗?我想为我的应用程序创建一个模块结构

非常感谢


在这方面,Dmitry是一种静态类型语言。这意味着如果将
record
定义为
record
。其所有键的类型始终为
型号

如果您想要更复杂的类型。您应该使用泛型或提前定义它

const record = {
  classA: new A(),
  classB: new B(),
}
泛型需要一个包装器

class RecoldHolder<T extends Record<string, Model>> {
  record: T;

  get<K extends keyof T>(key: K): T[K] {
    return this.record[key];
  }
}
类回收器{
记录:T;
get(key:K):T[K]{
返回此。记录[键];
}
}


PS:永远不要使用关键字作为函数名,有时会遇到非常奇怪的行为。使用
getter
,而不是
get
,等等。

只有当您愿意使用对象文本一次性初始化
记录时,才能执行此操作。不太清楚“get type”是什么意思,但如果您可以使用已知键初始化对象,则typescript将自行推断类型(
const-record=record
我假设它应该是
const-record:record={};
class RecoldHolder<T extends Record<string, Model>> {
  record: T;

  get<K extends keyof T>(key: K): T[K] {
    return this.record[key];
  }
}