javascript - 如何在 Typescript 中定义泛型变量?
问题描述
考虑两个 Typescript 接口 A 和 B:
interface A {
propertyA: string;
propertyB: string;
propertyC: string;
propertyD: string;
propertyE: string;
}
interface B {
propertyF: string;
propertyG: string;
propertyH: string;
propertyI: string;
propertyJ: string;
propertyK: string;
}
我想定义一个常量,一个键值对,它将字符串值与接口 A 或接口 B 配对。
const keyValuePair: { [key: string]: A | B} = {};
然后,一个函数将传入一个通用值 T,它指示键值对中的值是什么,我将返回具有适当值对象的键值对:
export async function getKeyValuePair<T>(keyId: string): Promise<T> {
if (keyValuePair<T>[keyId]) {
return keyValuePair<T>[keyId];
}
}
明显地。以上将不起作用。但是,我怎样才能让它工作呢?如果我只是在做接口 A,我会执行以下操作,它会正常工作:
const keyValuePair: { [key: string]: A} = {};
export async function getKeyValuePair(keyId: string): Promise<A> {
if (keyValuePair[keyId]) {
return keyValuePair[keyId];
}
}
我意识到我可以做到以下几点:
const keyValuePair: { [key: string]: any} = {};
但我真的想要更好的东西,如果可能的话,我想避免使用“任何”。我该怎么做?
解决方案
如果您的目标是检索一个对象并将其转换为某种类型,您可以这样做:
export async function getKeyValuePair<T>(keyId: keyof T): Promise<T> {
return keyValuePair[keyId] as unknown as T;
}
所以你可以这样使用:
getKeyValuePair<B>('propertyF');
推荐阅读
- php - 如何使用 PHP 从 XML 节点获取 DateTime?
- docker - 警告:忽略 http://dl-cdn.alpinelinux.org/alpine/v3.9/main:没有这样的文件或目录
- javascript - JavaScript:点击时无法获取 tagName
- c# - 具有可为空对象属性的 Linq“where”条件导致“调用非静态方法需要一个目标”
- c# - Unity DateTime 在 JsonUtility.FromJsonOverwrite 之后为空
- r - 将数据从 R 汇总对象提取到表中
- groovy - 为什么使用 MOP 的 Groovy metaClass .static 更改未按预期运行
- pine-script - Pinescript,如何设置和指标值仅在进入新仓位而不在指标变化时修改?
- artifactory - Artifactory 到 Artifactory 远程仓库
- svg - 用本地 SVG 替换标题中的 Font Awesome