簡體   English   中英

用於通用T的類型聲明可能是也可能不是分層的?

[英]What type declaration to use for a generic T that may or may not be hierarchical?

我正在擴展一個React表(創造性地稱為“表”),它采用通用數據數組,以及一些列配置數據,並呈現一個表。 聲明如下:

export class Table<T> extends React.Component<TableProps<T>, any>

TableProps的非可選部分:

export interface TableProps<T> {
    columnConfigs: TableColumnConfig<T>;
    tableStore: TableStore<T>;
}

TableStore只有一個必需屬性:

export class TableStore<T> {
    public data: T[];
}

TableColumnConfigs並不是非常重要,因為T僅用於可選屬性:

export interface TableColumnConfigs<T> {
    render?: (data: T) => JSX.Element
}

這個<Table>已經在好幾個地方使用了,我正在添加一個功能:可選的分層數據,所以我們可以停止使用Kendo的TreeList (這非常非常有用,但在我們的環境中加載有點慢) 。

我的問題:我想聲明T,表中使用的數據類型,由類外的人提供, 可能有一個特定的屬性,使該類型具有遞歸子,但不是必需的。

我試過這個:

export interface ChildData<T> {
    children?: (T & ChildData<T>)[]
}
export class Table<T extends ChildData<T>> extends React.Component<TableProps<T>, any> ...

這不起作用,因為外部類沒有定義名為“children”的屬性。

問題是TypeScript 2.8不喜歡它:當我實際上在某處使用Table時,它會發出T沒有實現ChildData的問題。 (我現在正在使用TS 2.3進行編譯,但是我會升級到2.4,在某些時候,很快就會發生,我發誓。最終。無論如何,我絕對不希望被阻止升級。我知道它在2.8上不起作用,因為我的IDE使用2.8運行Intellisense,但我正在運行2.3編譯器。)

我也嘗試使用union和intersection類型聲明,但它們根本不編譯,即使在TS 2.3下:

export class Table<T & ChildData<T>> extends React.Component<TableProps<T>, any> ...
export class Table<T | ChildData<T>> extends React.Component<TableProps<T>, any> ...

有沒有辦法說“我有一個通用參數T,可以實現一個ChildData,但不是必需的?” 我的<Table>組件已經在其他地方的幾個地方使用過,而且它將由不是我的人使用。 我不希望要求Table的使用者也通過他們沒有使用的“children”屬性來擴展他們的T類型(因為表的層次結構特征是完全可選的)。

在經歷了一些困難之后,我終於意識到ChildData只在一個地方很重要:在TableStore的“data”屬性中,這是所有相關數據存在的地方。 所以我重新定義了TableStore:

export class TableStore<T> {
    public data: (T & ChildData<T>)[];
    constructor(input: T[]) { this.data = input; }
}

顯然,你不能使用&和| 在通用參數中,但“擴展”是可以的。 而且,如果你不斷傳遞泛型參數,TypeScript最終會失去對泛型的精細細節的追蹤。 在類中使用T並在屬性中使用(T&somethingElse)的行為允許我直接將T分配給(T&somethingElse)。

我假設,就像TypeScript 2.4收緊泛型一樣,未來的TypeScript版本將禁止我目前正在逃避的惡作劇。

請注意,實現有點不穩定,因為我必須在<Table>內的幾個地方以及消費類中轉換為<T&ChildData <T >>,因為我正在生成TableStore的數據。

暫無
暫無

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

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