簡體   English   中英

如何推斷通用屬性類型?

[英]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>.aPropFancyProp類型?

對於您的主要問題,在給定對象類型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添加了一個構造函數,因為應該初始化類屬性,並且我想表明當uU時,可以為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

好的,希望有幫助; 祝你好運!

Playground 鏈接到代碼

暫無
暫無

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

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