首页 > 解决方案 > 如何动态检索类属性类型?

问题描述

我有一个类应该保留一些由确切类型定义的值。这是我的班级的简化视图:

interface SomeType1 {
  id1: string;
  data1: object;
}

interface SomeType2 {
  id2: string;
  data2: object;
}

export enum Databases {
  db1 = 'db1',
  db2 = 'db2',
}

interface Tables {
  [Databases.db1]: SomeType1;
  [Databases.db2]: SomeType2;
}

class MyClass {
  tables: Tables;

  constructor(tables: Tables) {
    // simplified to not oveload with code
    this.tables = tables;
  }
}

const MyInstance = new MyClass();

export default MyInstance;

这就是我想使用它的方式

import MyInstance, { Databases } from './db';

export const useDB = (table: Databases) => {
  const currentTable = MyInstance.tables[table];
  // simplified to not oveload with code
  return currentTable;
};

我想要实现的是useDB根据提供的值(Databases.db1Databases.db2)在函数中返回的确切类型,但我得到的计算类型SomeType1 | SomeType2不能满足我的需求。有没有办法使用泛型获得确切的类型?我正在努力解决这个问题。谢谢!

标签: typescripttypescript-generics

解决方案


这是泛型的一个非常简单的用法。将输入变量的类型捕获为泛型,以便打字稿可以在调用函数时使用它来推断正确的返回类型。

例如:

export const useDB = <DB extends Databases>(table: DB) => {
  const currentTable = MyInstance.tables[table];
  // simplified to not oveload with code
  return currentTable;
};

const db1 = useDB(Databases.db1); // has type: SomeType1
const db2 = useDB(Databases.db2); // has type: SomeType2

游乐场链接


推荐阅读