繁体   English   中英

打字稿:枚举泛型类型作为函数的参数

[英]Typescript: enum generic Type as parameter to function

我有一个函数,它接受两个参数,一个是键,另一个是枚举类型。 我试图用强类型来概括这个函数来获取任何枚举类型并返回值:

export const getStatus = <T>(key: string, statEnum: any): string => {
 return statEnum(key);
}

函数调用:

console.log(getStatus<SVC_A>('AUTH_122', SVC_A));

上面的函数适用于任何statEnum: any但如果我将其更改为statEnum: typeof T它会引发错误消息

T 仅指一种类型,但在这里用作值

如果我添加变量,参数输入有效

type supportedEnums = typeof SVC_A | typeof SVC_B
export const getStatus = <T>(key: string, statEnum: supportedEnums): string => {
 return statEnum(key);
}

很好奇,为什么它适用于 supportedEnums 类型,但是当它添加为typeof T时却没有。

我也试过了

export const getStatus = <T>(key: string, statEnum: T): string => {
 return statEnum(key);
}

将函数参数类型更新为 T statEnum: T它在调用函数函数调用时抛出错误消息:

console.log(getStatus<SVC_A>('AUTH_122', SVC_A));

“typeof SVC_A”类型的参数不可分配给“SVC_A”类型的参数

是否有可能将枚举定义为参数和类型安全?

首先,您不需要使用显式泛型参数。 考虑这个例子:

enum SVC_A {
    INVALID = 'INVALID',
    YENNA = 'YENNA',
    AUTH_122 = 'AUTH FAILED',
}

type PseudoEnum = Record<string | number, string | number>


function getStatus<Enum extends PseudoEnum, Key extends keyof Enum>(statEnum: Enum, key: Key) {
    return statEnum[key];
};

const foo = getStatus(SVC_A, 'YENNA') // SVC_A.YENNA

Playground相关问题列表:

在这里您可以找到我的文章,其中包含更多上下文和解释

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM