gpt4 book ai didi

typescript - 如何将带有另一个字符串枚举键的枚举传递给接受字符串的函数?

转载 作者:行者123 更新时间:2023-12-04 15:17:05 27 4
gpt4 key购买 nike

我正在尝试将字符串枚举传递给需要字符串的函数。问题是这个字符串枚举必须从一个(全局)常量枚举中分配,该枚举包含我们存储库中的所有常量。

enum Constants {
hello = "Hello"
}

enum Potato {
h = Constants.hello
}

function takesAString(s: string) {
console.log(s + ", world!");
}
takesAString(Potato.h);
// ERROR: Argument of type 'Potato' is not assignable to parameter of type 'string'
虽然人们会期望 Potato.h是字符串类型(因为它从字符串枚举常量分配了一个字符串),实际上它出错了,错误是“Potato”不能分配给字符串类型的参数。这对我来说意味着 Typescript 编译器无法推断 Potato.h 是一个字符串。
有用的东西:
enum Potato {
h = "Hello"
}

function takesAString(s: string) {
console.log(s + ", world!");
}
takesAString(Potato.h);
// OK
enum Constants {
hello = "Hello"
}

enum Potato {
h = Constants.hello
}

function takesAString(s: string) {
console.log(s + ", world!");
}
takesAString(Potato.h.toString());
// OK: toString() causes "Hello, world!" to be printed
我正在使用 Typescript 3.8.3 版
Playground Link

最佳答案

这看起来像是 typescript 中的错误,我提出了 bug report here看起来 typescript 正在输入 Potato枚举作为数字,这显然是错误的。
字符串枚举不允许有计算成员,例如,如果你这样做:

declare function returnsString(): string;
enum Test {
a = returnsString();
}
你得到这个错误:

Only numeric enums can have computed members, but this expression has type 'string'. If you do not need exhaustiveness checks, consider using an object literal instead.


因此,您可能想要使用对象文字,它不需要重写整个代码库,只需将枚举更改为如下所示:
type Constants = typeof Constants[keyof typeof Constants]
const Constants = {
hello: "Hello"
} as const

type Potato = typeof Potato[keyof typeof Potato]
const Potato = {
h: Constants.hello
} as const;

关于typescript - 如何将带有另一个字符串枚举键的枚举传递给接受字符串的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64145849/

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