枚举具有枚举项的类型(
Animal
)同时也是对象的一种类型,它在运行时保存值。此对象也被命名为
动物
,但它不是类型
动物
因为它包含枚举的所有条目。如果我们从枚举容器对象的类型开始(
typeof Animal
)要返回枚举的类型,我们需要编写
typeof Animal[keyof typeof Animal]
在你的情况下,
T
推断为
动物类型
,枚举容器对象,因为这是传递给函数的内容。要返回枚举类型,我们需要执行以下操作
T[keyof T]
enum Animals {
WOLF = 'wolf',
BADGER = 'badger',
CAT = 'cat',
}
const coerseEnum = <T> (s: string, E: T): T[keyof T] | undefined => {
const keys = Object.keys(E);
const values = keys.map(k => E[k as any]);
const obj = lodash.zipObject(keys, values);
const key = lodash.findKey(obj, item => item === s);
if (!key) return undefined;
return E[key];
};
const x: Animals | undefined = coerseEnum('cat', Animals);
console.log(x);
注释
我们通常不会注意到这一点,但当我们使用
动物
在类型注释中,它是枚举项的类型,当我们使用
动物
作为一个值,我们讨论的是不属于类型的容器对象
动物
. 只是想澄清一下,以防上一段不完全清楚。