typescript - 如何动态检索类属性类型?
问题描述
我有一个类应该保留一些由确切类型定义的值。这是我的班级的简化视图:
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.db1
,Databases.db2
)在函数中返回的确切类型,但我得到的计算类型SomeType1 | SomeType2
不能满足我的需求。有没有办法使用泛型获得确切的类型?我正在努力解决这个问题。谢谢!
解决方案
这是泛型的一个非常简单的用法。将输入变量的类型捕获为泛型,以便打字稿可以在调用函数时使用它来推断正确的返回类型。
例如:
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
推荐阅读
- c - C中按值或指向结构的指针的多个参数
- css - mvc5 创建新的 CSS 不起作用
- php - yii2无法上传视频文件
- delphi - Delphi:如何在后代中重载父构造函数但将其隐藏在其他不同的后代中
- cuda - 为什么 CUDA 索引是二维的?
- sql - 在 SQL 中将数字转换为日期 (DD-MON-YY)
- sed - 在 Makefile 中使用 SED 将 yarn 生成的文件名替换为哈希
- octave - 如何在 ubuntu 的 Octave 中安装符号包?
- java - Destinationsource.getQueues 未使用 SSL-Connection 返回正确数量的队列
- amcharts - Amcharts Maps,如何设置和获取 MapPolygonSeries 的 id?