typescript - 我如何將介面中的函數與型別結合?
為了一個學校專案,我應該使用 TypeScript 的進階型別來製作一個型別安全的 LINQ。
我正在努力尋找一種方法,讓我所有的表(類型)都使用相同的介面。
我希望這些函數能夠串接起來像這樣:
students.Select("Name", "Surname").Include("Grades", q =>
q.Select("Grade", "CourseId" )
)
所以我從一個類型 student 開始,並創建了一個表 students 並填入了一些值:
type Student = {
Name: string,
Surname: string
}
let students: Student[] = [
{Name: "Foo", Surname: "Bar"},
{Name: "John", Surname: "Wick"}
]
並且想將它與介面結合,這樣我就不必多次重寫 select。
interface Entity<T> {
Select: (args: T[]) => T
}
嘗試透過 type Student=Entity<T> & { 來結合似乎行不通,因為那樣我需要在 students 表中添加泛型類型 T,並為每個類型創建 select。
我該如何讓資料表 students 能夠使用 Entity<T> 的函數,並像第一個範例中那樣串接使用呢?還是我這樣處理這個問題的方法不對,應該嘗試不同的角度呢?
如果有必要,我可以提供更多資訊,但不想讓它變得太冗長。
答案#1
在 Javascript 中,的確可以像你嘗試的那樣為 Array 物件新增方法,但這通常被認為不是一個好主意(想像一下,如果你正在使用的一個函式庫試圖在全域 Array 物件上新增一個同名方法的情況!)
我建議創建一個新的陣列類型,該類型擴展基本陣列類型。例如
class LinqArray<T> extends Array<T> {
Select(...args: T[]): LinqArray<T> {
// Implementation
}
}
let students: LinqArray<Student> = new LinqArray();
students.push({Name: "Foo", Surname: "Bar"});
students.push({Name: "John", Surname: "Wick"});
// Works
students.Select("prop");
