我正在根据用户输入编写粗略的抽象语法树。在我的AST类型中,我想要有效运算符的类型文字。如何以安全的方式将用户输入(字符串)转换为字符串类型文字?考虑下面的代码段。
type operator = '==' | '!=';
function isOperator(raw: string): raw is operator {
return ['==', '!='].indexOf(raw) !== -1
}
const parseOperator = (raw: string) => {
if (isOperator(raw)) {
return raw
} else {
throw new Error('Invalid input')
}
}
const indata: string[] = ['!=', '!=', '==','a']
const data: operator[] = indata.map(parseOperator)
在代码中,我复制了有效的运算符(一次在类型定义中,稍后在解析逻辑中)。这似乎是构造代码的一种不好的方法,因为更新运算符类型意味着我必须在其他地方更新硬编码数组。
执行此断言的特殊打字方式是什么?
PS。我意识到这个问题:Ways to get string literal type of array values without enum overhead是相关的。尽管如此,对我来说,回答似乎有点讨厌。如果这是最好的解决方案 - 请解释为什么它是一个很好的编码风格。