我有很多这样的枚举:
enum MyEnum {
foo = 'SomeFoo',
bar = 'SomeBar',
buzz = 'SomeBuzz',
quux = 'SomeQuux',
}
我想为每个枚举定义互补类型,如下所示:
interface MyShape {
foo?: number;
bar?: number;
buzz?: number;
quux?: number;
}
因此,以下代码必须进行类型检查:
function doSomething(props: MyShape): number {
props.missing; // must be an error
// Do something with values
return props.bar! * props.buzz!;
}
doSomething({
foo: 314,
bar: 15,
buzz: 92,
quux: 6,
missing: 10101, // must be an error
});
但是,我不想让属性列表在MyEnum
和MyShape
之间保持同步,因此我尝试从MyShape
派生MyEnum
。我这样做{strong>成功,following code:
type EnumToShape<T> = { [K in keyof T]?: number; }
type MyShape = EnumToShape<typeof MyEnum>;
但是,我不得不写EnumToShape<typeof MyEnum>
而不仅仅是EnumToShape<MyEnum>
困扰着我。不幸的是,这就是我被困住的地方。
当我尝试做这样的简单事情时:
type EnumToShape<T> = { [K in keyof typeof T]?: number; }
type MyShape = EnumToShape<MyEnum>;
typeof T
对TypeScript的抱怨是“ T仅指一种类型,但在此处被用作值`。”
它如何用作值?
即使我将typeof MyEnum
替换为enum MyEnum { ... }
,为什么仍然提供declare enum MyEnum { ... }
也不是错误,所以它现在是纯类型变量?
如何告诉TypeScript做我想做的事情? :)