Я пытаюсь написать некоторые парсеры в 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 Есть ли какие-либо стандартные шаблоны, чтобы обойти это ограничение?Единственные «решения», о которых я могу подумать:
Превратить char
в функцию: function char<U>(): P<U> {...; return realChar}
.Я не считаю этот обходной путь привлекательным, потому что каждый раз, когда я запускаю char()
.
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?]