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

How to tell TypeScript my function argument is an Enum key?

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

我可以通过访问它们的密钥轻松获取这些代码(注意 IntelliSense 如何在右侧面板上显示 HttpStatus.NOT_FOUND = 404

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

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

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

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

enum HttpStatus {
    OK = 200,
    CREATED = 201
}

function printStatus(code: keyof typeof HttpStatus) {
    const num = HttpStatus[code];
    if (num <= HttpStatus.CREATED) {
       console.log('HTTP Status key is: ', code);
       console.log('HTTP Status value is: ', num);
    }
}

printStatus("OK");

// Prints out
// > HTTP Status key is:  – "OK"
// > HTTP Status value is:  – 200
// Which shows that Enum value is being detected properly

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

你想要的东西不是直接可以实现的。当您执行 keyof typeof 时,您创建了一个联合类型 'CREATED' | 'OK' | 'NOT_FOUND' ...,它与曾经的枚举完全分开。

最接近的方法是做

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

send(HttpStatus.OK) // This will autocomplete and show the status code numbers

然后在 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

通常很少有充分理由在现代 TS 中使用 enums。通常对象 and/or 联合类型做得更好。