让我们以 O(1) 的复杂度来完成吧...
给定一个通用的不变函数 -
function invariant(condition: unknown, message?: string): asserts condition {
if (condition) return
throw Error(`Invariant violation: ${message ?? "truthy value expected"}`)
}
使用
keyof typeof Language编写invariantLanguage
function invariantLanguage(lang: string): asserts lang is keyof typeof Language {
invariant(lang in Language, `"${lang}" is not a valid language`)
}
现在你可以在字符串输入上使用
invariantLanguage
-
enum Language {
nl = 1,
fr = 2,
en = 3,
de = 4,
}
const x = "en"
invariantLanguage(x)
console.log(x)
const y = "foo"
invariantLanguage(y)
console.log(y)
在TypeScript Playground上验证。
它还展示了与字符串枚举正常工作的示例 -
// ...
enum Language {
nl = 1,
fr = 2,
en = 3,
de = 4,
ja = "japanese", // also works if you have strings
}
const x = "ja"
invariantLanguage(x)
console.log(x) // : "ja"
请注意不要将“值”误认为“键”。
const y = "japanese"
invariantLanguage(y) // ERROR Invariant violation: "japanese" is not a valid language
console.log(y) // : never
请在TypeScript Playground上进行验证。