如何告诉 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 中使用 enum
s。通常对象 and/or 联合类型做得更好。
我有一个将 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 中使用 enum
s。通常对象 and/or 联合类型做得更好。