首页 > 解决方案 > 如何在 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} = {};

但我真的想要更好的东西,如果可能的话,我想避免使用“任何”。我该怎么做?

标签: javascripttypescriptgenerics

解决方案


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

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

所以你可以这样使用:

getKeyValuePair<B>('propertyF');

推荐阅读