TypeScript-强制接口使用字符串枚举成员

时间:2018-08-27 08:13:41

标签: typescript

我有一个自动生成的枚举(来自NSwag),它会为我生成以下内容:

export enum Frequency {
  Weekly = 1, 
  Fortnightly = 2, 
}

对于我的界面,我想说这是一个必须来自Frequency的字符串值。我最接近的是:

interface GtmProduct {
  dimension6: keyof Frequency;
}

我也尝试dimension6: 'weekly' | 'fortnightly'无济于事。

在使用中,它看起来像这样:

{ ...
  dimension6: Frequency[frequency].toLowerCase() //frequency here will be `Frequency.Weekly`
}

出现以下错误:Type 'string' is not assignable to type '"toString" | "toFixed" | "toExponential" | "toPrecision" | "valueOf" | "toLocaleString"'.

有什么方法可以使用TS 2.9实现我想要的吗?还是应该简单地将其键入为字符串?

2 个答案:

答案 0 :(得分:1)

首先-您必须使用keyof typeof Frequency才能获得“每周”的联合类型| “半月刊”'。请遵循此C strings handling functions以获得更多详细信息。

TS issue 14294 设置GtmProduct值时,也可以使用类型转换。所以这是最终的解决方案:

type KeyOfFrequencey = keyof typeof Frequency;

interface GtmProduct {
  dimension6: KeyOfFrequencey;
}

const toKeyOf = (f: Frequency): KeyOfFrequencey => Frequency[f] as KeyOfFrequencey;

const frequency = Frequency.Weekly
const a: GtmProduct = {
  dimension6: toKeyOf(frequency)
}

但是在您的示例中,我看到.toLowerCase()可能不正确,因为您的Enum键具有大写的属性,并且您将在界面中将其小写。这就是为什么我在示例中删除了小写字母的原因。

如果要使用小写的值,则必须在枚举中也使用小写的键:

enum Frequency {
  weekly = 1, 
  fortnightly = 2, 
}

enter image description here

中尝试此示例

答案 1 :(得分:-1)

您要在维度6变量中获取“每周”信息吗? 看看https://www.typescriptlang.org/docs/handbook/enums.html这是您想要的反向映射。