相关疑难解决方法(0)

如何从 TypeScript 中的枚举值构建类型?

鉴于以下情况:

enum FooKeys {
  FOO = 'foo',
  BAR = 'bar',
}
Run Code Online (Sandbox Code Playgroud)

我想制作一个这样的界面,但不是手动定义键,而是用枚举的值构建它。

interface Foo {
  foo: string
  bar: string
}
Run Code Online (Sandbox Code Playgroud)

TypeScript 可以实现这样的功能吗?

谢谢!

types typescript typescript-generics

25
推荐指数
4
解决办法
2万
查看次数

将通用键作为联合字符串中的联合字符串获取的通用类型?

请考虑以下typescript枚举:

enum MyEnum { A, B, C };
Run Code Online (Sandbox Code Playgroud)

如果我想要另一种类型是该枚举键的联合字符串,我可以执行以下操作:

type MyEnumKeysAsStrings = keyof typeof MyEnum;  // "A" | "B" | "C"
Run Code Online (Sandbox Code Playgroud)

这非常有用.

现在我想以这种方式创建一个在枚举上普遍运行的泛型类型,这样我就可以说:

type MyEnumKeysAsStrings = AnyEnumKeysAsStrings<MyEnum>;
Run Code Online (Sandbox Code Playgroud)

我想是正确的语法是:

type AnyEnumKeysAsStrings<TEnum> = keyof typeof TEnum; // TS Error: 'TEnum' only refers to a type, but is being used as a value here.
Run Code Online (Sandbox Code Playgroud)

但是这会产生编译错误:"'TEnum'只引用一个类型,但在这里被用作值."

这是出乎意料和悲伤的.通过从泛型声明的右侧删除typeof,并将其添加到特定类型声明中的type参数,我可以通过以下方式完全解决它:

type AnyEnumAsUntypedKeys<TEnum> = keyof TEnum;
type MyEnumKeysAsStrings = AnyEnumAsUntypedKeys<typeof MyEnum>; // works, but not kind to consumer.  Ick.
Run Code Online (Sandbox Code Playgroud)

我不喜欢这种解决方法,因为这意味着消费者必须记住在通用上指定typeof.

是否有任何语法允许我指定我最初想要的泛型类型,以便对消费者友好?

generics enums typescript

18
推荐指数
4
解决办法
6074
查看次数

TypeScript:将键值类型反向映射到值键

给定一个类型的对象:

type Key2Value = {
  foo: "bar"
  voo: "doo"
}
Run Code Online (Sandbox Code Playgroud)

假设该类型的值始终是字符串类型,那么如何构造一个ReverseMap<T>将键值对反向映射到值键对的实用程序类型?

type Value2Key = ReverseMap<Key2Value>
// yields:
type Value2Key = {
  bar: "foo"
  doo: "voo"
}
Run Code Online (Sandbox Code Playgroud)

typescript

5
推荐指数
1
解决办法
4499
查看次数

标签 统计

typescript ×3

enums ×1

generics ×1

types ×1

typescript-generics ×1