簡體   English   中英

在 typescript 接口中有某種“計算”屬性嗎?

[英]Have some sort of "computed" properties in typescript interfaces?

我們目前在項目的 ORM 部分被一些 typescript 打字阻塞。 出於一些遺留/模糊的原因,我們正在運行我們自己的。

我們現在需要的是能夠正確鍵入模型的查詢條件以說明關系。 這是一個例子:

interface Model1{
    id:string;
    name:string;
    childId:string;
}
interface Model1Relations{
    child:Model2;
}
type Model1WithRelations = Model1 & Model1Relations;
interface Model2{
    id:string;
    name:string;
}

非常簡單,Model1 使用 childId 作為 belongsTo 關系。 我們有 map 關系部分的中介接口。 這允許我們使用基本接口進行插入和更新等,以及選擇上的其他 Model1WithRelations。

當我們向查詢添加 where 子句時,我們用 object 定義它,如下所示: {name:"Bob"} 使用 Partial 可以輕松完成輸入。 (為簡單起見,因為我們還允許使用 lowerThan、not equal、includedIn 等運算符)。

現在,我們(終於)在我們的查詢中創建了原生連接,我們現在可以根據它們的關系搜索實體。 如果我想獲得以 Bob 作為其子項的 model1,我可以執行{"child.name":"Bob"} ,但這不滿足類型要求。

如果我們改用 Partial,如果我們改變我們寫 where 的方式,我們就可以使類型工作: {child:{name:"Bob"}}但我們認為這會讓事情更難閱讀和理解,考慮到條件當與 AND、OR 和幾個不同的運算符配對時會變得瘋狂,這些運算符是通過傳遞一個 object 已經像{name:{like:"%bob%"}}

可行嗎? 我們可以實現我們正在尋找的東西嗎? 哪個將屬性名稱與其類型的屬性名稱連接起來? 我發現很難相信這是可能的……所以如果不是,你會建議我們做什么,其他人在做什么? 我看到大多數其他 ORM 只是沒有嚴格地鍵入它們的條件,我們認為這會造成傷害。

我不確定我是否完全理解您的問題,但您可以執行以下操作:

type ModelRelationsConcatenated<T> = {
    [K in keyof T[keyof T] as `${Exclude<keyof T, symbol>}.${Exclude<K, symbol>}`]: T[keyof T][K];
}

操場

類型

這只是一個例子來說明它是可能的,但您可能想對此進行一些更改以更好地適應您的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM