如何告诉 TypeScript 我的函数参数是 Enum 键?

Ber*_*ano 7 intellisense typescript visual-studio-code

我有一个将 HTTP 状态映射到其代码的枚举,如下所示:

在此处输入图片说明

我可以通过访问它们的键轻松获取这些代码(注意 IntelliSenseHttpStatus.NOT_FOUND = 404在右侧面板上的显示方式)

在此处输入图片说明

现在假设我有一个名为 sendStatus 的函数:

我应该如何键入此函数才能让 IntelliSense 自动完成这些代码?

在此处输入图片说明

使用keyof typeof不起作用,因为它不会自动完成枚举值。

Squ*_*uit 10

你想要的不是直接可能的。当您这样做时,keyof typeof您将创建一个'CREATED' | 'OK' | 'NOT_FOUND' ...与曾经的枚举完全分开的联合类型。

你能得到的最接近的是做

function sendStatus(code: HttpStatus) {
    // code
}

send(HttpStatus.OK) // This will autocomplete and show the status code numbers
Run Code Online (Sandbox Code Playgroud)

然后在sendStatus函数内部将代码转换为字符串。

在不知道您正在寻找的确切用法的情况下很难说出您真正想要什么,但我会考虑只使用一个普通的旧对象而不是枚举

const HTTP_STATUS = {'OK':200, 'CREATED':201} as const

然后,如果需要,您也可以像这样创建这两种类型

type StringStatus = keyof typeof HTTP_STATUS // 'OK' | 'CREATED'
type NumsStatus = (typeof HTTP_STATUS)[keyof typeof HTTP_STATUS] // 200 | 201
Run Code Online (Sandbox Code Playgroud)

通常,enum在现代 TS 中很少有充分的理由使用s。通常对象和/或联合类型可以更好地完成这项工作。


shp*_*sta 5

您可以keyof typeof通过运行这样的示例进行测试,这表明 Enum 本身在您的情况下工作正常。

\n\n
enum HttpStatus {\n    OK = 200,\n    CREATED = 201\n}\n\nfunction printStatus(code: keyof typeof HttpStatus) {\n    const num = HttpStatus[code];\n    if (num <= HttpStatus.CREATED) {\n       console.log(\'HTTP Status key is: \', code);\n       console.log(\'HTTP Status value is: \', num);\n    }\n}\n\nprintStatus("OK");\n\n// Prints out\n// > HTTP Status key is:  \xe2\x80\x93 "OK"\n// > HTTP Status value is:  \xe2\x80\x93 200\n// Which shows that Enum value is being detected properly\n
Run Code Online (Sandbox Code Playgroud)\n\n

keyof typeof获取将所有 Enum 键表示为字符串的类型,这就是自动完成行为如此的原因。\n https://www.typescriptlang.org/docs/handbook/enums.html#enums-at-compile-time

\n