处理Typescript中的多态值

时间:2018-10-17 22:16:44

标签: typescript class generics types polymorphism

我正在尝试在Typescript中编写一些解析器。我的解析器都是基类Parser的所有实例,它们分别由类型AS参数化,表示解析的结果和解析器的状态。

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是否有任何标准模式可以规避此限制?我能想到的唯一“解决方案”是:

  1. char用作函数:function char<U>(): P<U> {...; return realChar}。我发现这种解决方法没有吸引力,因为每次我运行char()时都会花费运行时间。

  2. 将依赖于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路线图上是否有诸如“泛型类型的值”之类的东西(有更好的术语吗?)

0 个答案:

没有答案