typescript - Typescript 中的枚举类型是什么?
问题描述
给定一个函数,该函数的参数应该是enum
. 传入的enum
可以有不同数量的属性。如何修复该参数的类型?enum
本身不是一个类型。
例如:
function (myEnum: mysteriousType){
//What is that mysteriousType ?
}
用例是构建一个通用方法来从枚举实例化dat.GUI选项,无论枚举中的字符串/数字类型是什么。
解决方案
到目前为止你所说的(需要接受所有字符串/数字/异构枚举),我能做的最接近的是这样的:
type Enum<E> = Record<keyof E, number | string> & { [k: number]: string };
function acceptEnum<E extends Enum<E>>(
myEnum: E
): void {
// do something with myEnum... what's your use case anyway?
}
enum E { X, Y, Z };
acceptEnum(E); // works
如果您只知道它是“某种枚举类型”,我不确定您将要做什么,但我想这取决于您自己想办法。myEnum
我是如何想出这个的:我检查了一堆具体enum
类型,它们似乎具有带有字符串键和字符串或数值的属性(正向映射),以及带有字符串值的数字索引键(反向映射数值)。
const works: { X: 0, Y: 1, Z: 2, [k: number]: string } = E; // works
语言设计者可能会进一步限制这一点,因为反向映射只会产生在正向映射中看到的特定数字键和字符串值,但由于某种原因,它没有像这样实现:
const doesntWork: { X: 0, Y: 1, Z: 2, [k: number]: 'X' | 'Y' | 'Z' } = E; // error
const alsoDoesntWork: { X: 0, Y: 1, Z: 2, 0: 'X', 1: 'Y', 2: 'Z' } = E; // error
所以我可以对枚举类型施加的最严格的约束就是上面的E extends Enum<E>
。
请注意,此代码不适用于const enum
在运行时不存在的类型:
const enum F {U, V, W};
acceptEnum(F); // nope, can't refer to `F` by itself
还要注意,上面的类型 ( E extends Enum<E>
) 允许一些它可能不应该做的事情:
acceptEnum({ foo: 1 }); // works
在上面,{foo: 1}
似乎是一个类似于enum Foo {foo = 1}
但它没有反向映射的数字枚举,如果你依赖它,事情会在运行时爆炸。请注意,{foo: 1}
它似乎没有索引签名,但它仍然隐式匹配索引签名。除非您添加了一些明确的错误值,否则它不会不匹配:
acceptEnum({foo: 1, 2: 3}); // error, prop '2' not compatible with index signature
但是这里没有什么可做的。正如我上面提到的,enum
目前打字的实现并没有尽可能多地限制数字键,所以在编译时似乎没有办法区分一个具有良好反向映射的枚举和一个没有一个的枚举。
希望有帮助。祝你好运!
推荐阅读
- .net-core - 如何让 HttpClient GetAsync 等待异步加载数据的网页?
- python - 更快的屏幕捕获
- javascript - React:如何在 React 更新表单中显示已经存在的图像,然后在上传新图像后显示新图像?
- c - 将整数值作为二进制分配给C中的变量
- sql - 按缩放的日期时间索引 SQL 表
- excel - 如果包含某个数字(前 4 位),如何将数字复制到另一列 - EXCEL VBA
- cuda - 使用 AtomicAdd 函数时,共享内存大小限制为最大线程数
- python - Selenium python获取复杂的表数据
- java - 依赖项实现时Android Studio错误
- git - 开发和生产部门