gpt4 book ai didi

javascript - TypeScript 的字符串枚举或对象文字是否有(更好的)速记?

转载 作者:行者123 更新时间:2023-12-05 03:49:23 24 4
gpt4 key购买 nike

TypeScript 枚举如下所示:

enum Direction {
Up = "Up",
Down = "Down",
Left = "Left",
Right = "Right"
}

像这样的枚举声明在我看来是不必要的工作。特别是考虑到 DRY 原则。难道没有像这样的声明的简写形式,这样当它们等于键时我就不需要重复这些值了吗?当然,我可以使用数字枚举,但它们有一个缺点,即在调试期间不存在任何有意义的值。

例如 ES6 中的对象字面量速记:

firstname = 'firstname';
lastname = 'lastname';

fullname = {
firstname,
lastname
}

但即使有了这个简写定义,我仍然需要将例如 firstname 写三遍。有没有更简单的方法?

如果像这样的东西能工作就好了:

// for enums:
string_enum Direction {
Up,
Down,
Left,
Right
}

// for object literals:
fullname: {
'firstname',
'lastname'
}

最佳答案

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

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

在上面的例子中,AbKeys 是您在获取其中一个对象时可以使用的类型。请注意,这不是真正的枚举,因为您可以传入字符串,编译器会很高兴,而枚举则不是这种情况

示例

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

请参阅 TypeScript playground 上的示例

关于javascript - TypeScript 的字符串枚举或对象文字是否有(更好的)速记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63991766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com