[英]How to Infer Generic Property Types?
我不知道如何根據它所在對象的泛型類型來推斷泛型屬性的類型。 在下面的例子中,我怎么能說Something.aProp
需要匹配Something 的U.obj.prop
的類型?
interface Prop {
a: number;
}
interface FancyProp extends Prop {
b: number;
}
interface Obj<T extends Prop> {
prop: T;
}
interface FancyObj extends Obj<FancyProp> {}
interface Parent<T extends Obj<any>> { // <-- the <any> here seems wrong too
obj: T;
}
interface FancyParent extends Parent<FancyObj> {
fancy: number;
}
class Something<U extends Parent<any>> {
aProp: typeof U.obj.prop;
}
即Something<Parent>.aProp
應該是Prop
類型,而Something<FancyParent>.aProp
是FancyProp
類型?
對於您的主要問題,在給定對象類型T
和鍵類型K
情況下查找屬性值類型的方法是通過括號語法T[K]
使用查找類型,也就是索引訪問類型。 因此,如果您想查找U
類型對象的"obj"
鍵控屬性的"prop"
鍵控屬性的類型,您可以將該類型寫為U["obj"]["prop"]
。
請注意,點語法不適用於類型,即使鍵類型是字符串文字。 如果U.obj.prop
是類型系統中U["obj"]["prop"]
的同義詞U.obj.prop
了,但不幸的是,該語法會與 namespaces 發生沖突,因為可能有一個名為U
的命名空間,帶有名為obj
子命名空間,具有名為prop
的導出類型,然后U.obj.prop
將引用該類型。
對於您對any
的評論,當Y<T>
的類型參數T
具有泛型約束時,使用X extends Y<any>
並沒有錯,但它的類型安全性可能比您所能獲得的要低一些。 如果類型Y<T>
以協變方式與T
相關,那么您可以使用泛型約束而不是any
。
這意味着,例如, Parent<T extends Obj<any>>
可以替換為Parent<T extends Obj<Prop>>
,而U extends Parent<any>
可以替換為U extends Parent<Obj<Prop>>
.
這些更改為您提供如下代碼:
interface Parent<T extends Obj<Prop>> {
obj: T;
}
class Something<U extends Parent<Obj<Prop>>> {
aProp: U['obj']['prop'];
constructor(u: U) {
this.aProp = u.obj.prop;
}
}
我還向Something
添加了一個構造函數,因為應該初始化類屬性,並且我想表明當u
是U
時,可以為aProp
分配來自u.obj.pop
的值。
這應該按您的預期工作:
interface PlainObj extends Obj<Prop> { }
interface PlainParent extends Parent<PlainObj> { }
new Something<PlainParent>({ obj: { prop: { a: 1 } } }).aProp.a; // number
interface FancyObj extends Obj<FancyProp> { }
interface FancyParent extends Parent<FancyObj> {
fancy: number;
}
new Something<FancyParent>({ obj: { prop: { a: 1, b: 2 } }, fancy: 3 }).aProp.b; // number
好的,希望有幫助; 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.