我正在尝试在Typescript中编写一些解析器。我的解析器都是基类Parser
的所有实例,它们分别由类型A
和S
参数化,表示解析的结果和解析器的状态。
class Parser<A, S> {
parse: (state: S) => Response<A, S>
constructor(parse: (state: S) => Response<A, S>) {
this.parse = parse
// various combinator methods...
}
在我感兴趣的几种情况下,我希望状态S
适用于解析字符串,并且还适合承载某些用户定义的类型U
的有效负载。因此,感兴趣的S
可能会实现:
interface SS<U> {
str: string;
user: U
}
然后,我想构造一个我能想到的最基本的解析器:char
。它消耗并返回要分析的字符串中的第一个字符(如果有),否则返回失败。因此,我想要
char: Parser<string, SS<U>>
对于任何U
。
但是,遗憾的是,Typescript不允许包含泛型,函数,类等的值。[“变量不能有免费的泛型” ,如Titian很好地将其放在下面的评论中。] ph是否有任何标准模式可以规避此限制?我能想到的唯一“解决方案”是:
将char
用作函数:function char<U>(): P<U> {...; return realChar}
。我发现这种解决方法没有吸引力,因为每次我运行char()
时都会花费运行时间。
将依赖于U
的解析器包装 all :
function parsers<U>() {
let char: Parser<string, SS<U>> = ...
let letter: Parser<string, SS<U>> = ...
let digit: Parser<string, SS<U>> = ...
// other parsers
return {char, digit, letter, ...}
}
然后我可以在使用时通过运行parsers()
来实例化它们
他们,并有一个具体的
U
。
是否还有其他更优雅的方法或所需的运行时开销最小或建立的模式? [有人知道Typescript路线图上是否有诸如“泛型类型的值”之类的东西(有更好的术语吗?)