Я создаю эту проблему Безопасного типа LINQ в Typescript как часть школьного проекта.Полное описание проекта можно найти здесь: https://github.com/hogeschool/Software-Engineering-Minor/blob/master/Projects/project2%20-%20mini%20typesafe%20LINQ%20to%20SQL.md
В рамках проекта существует ограничение, определяющее порядок операторов.В моем случае оператор Select
должен быть единственной возможной и первой выполняемой операцией.После первого выбора становятся видны другие операторы: Include
, Where
, OrderBy
и GroupBy
.
Таким образом, вы не сможете группировать, фильтровать или сортировать, когда ничего не выбрано.
Я думал о том, чтобы разбить мой код на части, мне нужно иметь интерфейсы, один из которых называется Table
, который содержит данные, в которых выполняются операторы, и LazyTable
, который содержит только цепочку функций, которые должны быть применены кданные на более позднем стадионе программы.
Но я сталкиваюсь с некоторыми проблемами, когда дело касается зависимости от LazyTable
до Table
, потому что LazyTable
просто использует операции Table
.
interface Table<T, U> {
data: Data<T, U>
Select: () => Table
Include: () => Table
Where: () => Table
OrderBy: () => Table
GroupBy: () => Table
toList: () => List
}
interface LazyTable<T, U> {
query: Query<T1, U1, T2, U2>
Select: () => LazyTable
Include: () => LazyTable
Where: () => LazyTable
OrderBy: () => LazyTable
GroupBy: () => LazyTable
apply: (data) => Table
}
В настоящее время я могу инициализировать экземпляр Table
или LazyTable
и вызывать их методы:
users.Select("name", "email", "age").Include("Products", q => q.Select("price", "name", "quantity").Where("price", GreaterThan(100))).OrderBy("age", "DESC")
Я хочу, чтобы это происходило таким образомчто звонить:
users.Where()
users.Include()
users.OrderBy()
users.GroupBy()
невозможно до звонка Select
.