Работа с полиморфными значениями в Typescript - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь написать некоторые парсеры в 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 не допускает значений с использованием обобщений, только функций, классови т. д. [ «Переменные не могут иметь свободных обобщений» , как Тициан замечательно формулирует в комментариях ниже.] ph Есть ли какие-либо стандартные шаблоны, чтобы обойти это ограничение?Единственные «решения», о которых я могу подумать:

  1. Превратить char в функцию: function char<U>(): P<U> {...; return realChar}.Я не считаю этот обходной путь привлекательным, потому что каждый раз, когда я запускаю char().

  2. Wrap все мои синтаксические анализаторы, которые зависят от U вфункция:

    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?]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...