作为学校项目的一部分,我正在Typescript中构建此类型安全的LINQ问题。整个项目的描述可以在这里找到: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
,该数据仅包含要连接的函数链程序后面的体育场中的数据。
但是当涉及到{{1}上的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()
之前是不可能的。
答案 0 :(得分:1)
使您的Select
返回一个不同的接口,该接口包含其他方法,并且不要将它们包含在原始的Table
接口中。我认为这是唯一合理的方法。
您实际上的意思不是在呼叫table.Where
之前禁止呼叫table.Select
,而是完全禁止呼叫table.Where
。可以调用Where
的唯一对象是调用table.Select
的结果,对吗?因此,请使其成为不同的界面。