【发布时间】:2021-12-18 19:21:02
【问题描述】:
考虑两个 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} = {};
但我真的想要更好的东西,如果可能的话,我想避免使用“任何”。我该怎么做?
【问题讨论】:
-
“不起作用”是什么意思?你能在Typescript Playground 中重现一个例子吗?
-
请提供一个minimal reproducible example,清楚地说明您面临的问题,例如在说明预期结果和实际结果的情况下产生意外结果。理想情况下,有人可以将代码放入像The TypeScript Playground (link here!) 这样的独立IDE 中,然后立即着手解决问题,而无需首先重新创建它。请注意,在描述 minimal reproducible example 的指南中,它表示“它不起作用”的描述性不足以帮助人们理解您的问题。
-
非常感谢大家。我更新了问题。
-
您在寻找Generic Constraints吗?基本上将
T定义为联合A和B的类型? -
@StriplingWarrior 确定!
标签: javascript typescript generics