Javascript 打字脚本有(更好的)速记方法吗;s字符串枚举还是对象文字?

Javascript 打字脚本有(更好的)速记方法吗;s字符串枚举还是对象文字?,javascript,typescript,ecmascript-6,enums,Javascript,Typescript,Ecmascript 6,Enums,TypeScript枚举如下所示: 枚举方向{ Up=“Up”, Down=“Down”, Left=“Left”, Right=“Right” } 像这样的枚举声明在我看来似乎是不必要的工作。尤其是考虑到干燥原则。这样的声明不是有一个速记,这样我就不需要在值等于键时重复这些值了吗?当然,我可以使用数字枚举,但它们有一个缺点,即在调试期间不存在有意义的值 例如,与ES6中的对象文字速记类似: firstname='firstname'; lastname='lastname'; 全名={ 名字

TypeScript枚举如下所示:

枚举方向{
Up=“Up”,
Down=“Down”,
Left=“Left”,
Right=“Right”
}
像这样的枚举声明在我看来似乎是不必要的工作。尤其是考虑到干燥原则。这样的声明不是有一个速记,这样我就不需要在值等于键时重复这些值了吗?当然,我可以使用数字枚举,但它们有一个缺点,即在调试期间不存在有意义的值

例如,与ES6中的对象文字速记类似:

firstname='firstname';
lastname='lastname';
全名={
名字,
姓氏
}
但即使有了这个速记定义,我仍然需要写三次,例如
firstname
。难道没有更简单的方法吗

如果像这样的事情能奏效,那就太好了:

//对于枚举:
字符串枚举方向{
向上的
下来,,
左边
赖特
}
//对于对象文字:
全名:{
“名字”,
“姓氏”
}

这并不是你想要的;它不会创建真正的枚举,但会删除重复项,并提供类似枚举的行为。我们在真正的字符串枚举可用之前编写了这篇文章,并且已经基本停止使用它,因为字符串枚举中的重复可能并不完美,但它很少导致bug

/**
 * This creates a string enum.  Use like so:
 *     const Ab = strEnum(['a', 'b']);
 *     type AbKeys = keyof typeof Ab;
 * @param keys keys in the enum
 * @returns enum object
 */
export function createStringEnum<T extends string>(keys: T[]): {[K in T]: K} {
    return keys.reduce((res, key) => {
        res[key] = key;
        return res;
    }, Object.create(null));
}

请参见

上的示例,因为TypeScript 3.4,您可以使用

虽然不是枚举,但我喜欢使用这样的数组:

const DIRECTIONS = ["Up", "Down", "Left", "Right"] as const
type Direction = typeof DIRECTIONS[number]
function goTo(direction: Direction) {
  // ...
}

goTo(" // with that open quote, you would see a list of the string literals

使用对象作为“代表”来访问字符串(例如,
Direction.Up
)并没有什么好处,但是使用任何现代的TypeScript IDE配置,您将获得健壮的自动完成和类型覆盖率。

您可以尝试使用一种类型代替枚举,例如type DirectionType=“Up”|“down”|“left”|“right”@DhanukaPerera我想使用这样的值
goTo(Direction.Left)
。对于类型来说这是不可能的,对吗?@DhanukaPerera我希望VSCode能够自动完成directions@winklerrrIDE可以完成这样的(文字联合)如果使用数值枚举,如果不使用
const-enum
,则可以在js中进行有用的调试。看看从中生成的js。在我看来,对于这样一个“简单”的问题,这是一个相当复杂的解决方案。。。当其他人(或几周后的我)查看这些“字符串枚举”时,他们必须首先检查所有代码,以了解发生了什么。请不要误会我的意思,我认为您提供了一个很好的解决方案,我也猜是有效的解决方案,但与值与键匹配的简单枚举(即使这违反了DRY原则)相比,该代码的可读性似乎要低得多。@winklerr相当复杂?全部5行代码?我试图让它变得非常明显,我们在字符串枚举可用之前就使用了它,并指出了它的一些缺陷。我们现在只使用字符串枚举,我只是想在这里把它放出来,因为你有兴趣,我相信这是你能得到的最接近的。
const Ab = createStringEnum(['a', 'b']);
type AbKeys = keyof typeof Ab;
function choose(key: AbKeys) {
  if (key === Ab.a) {
    return 'A'
  }
  return 'B';
}
// Type error
console.log(Ab.c);
// OK
console.log(choose(Ab.b));
// A true string enum wouldn't allow this
console.log(choose('a'));
// At least, it does't allow this...
function test (a: string)  {
  console.log(choose(a));
}
const DIRECTIONS = ["Up", "Down", "Left", "Right"] as const
type Direction = typeof DIRECTIONS[number]
function goTo(direction: Direction) {
  // ...
}

goTo(" // with that open quote, you would see a list of the string literals