在TypeScript中使用通用类型变量的`typeof`

时间:2018-08-23 17:36:36

标签: javascript typescript generics

我有很多这样的枚举:

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
});

但是,我不想让属性列表在MyEnumMyShape之间保持同步,因此我尝试从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仅指一种类型,但在此处被用作值`。”

  1. 它如何用作值?

  2. 即使我将typeof MyEnum替换为enum MyEnum { ... },为什么仍然提供declare enum MyEnum { ... }也不是错误,所以它现在是纯类型变量?

  3. 如何告诉TypeScript做我想做的事情? :)

0 个答案:

没有答案