【问题标题】:How do I define a generic variable in Typescript?如何在 Typescript 中定义泛型变量?
【发布时间】: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


【解决方案1】:

如果您的目标是检索一个对象并将其转换为某种类型,您可以这样做:

export async function getKeyValuePair<T>(keyId: keyof T): Promise<T> {
    return keyValuePair[keyId] as unknown as T;
}

所以你可以这样使用:

getKeyValuePair<B>('propertyF');

【讨论】:

    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多