Skip to content

Commit 22d5600

Browse files
authored
fix(cdk/tree): add missing generic types to trackBy Fixes (#21364) (#21421)
* fix(cdk/tree): add missing generic types to trackBy Fixes (#21364) * fix(cdk/tree): add missing generic types to trackBy Fixes (#21364)
1 parent 3335a92 commit 22d5600

File tree

11 files changed

+66
-66
lines changed

11 files changed

+66
-66
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ node_modules
2525
/.idea
2626
/.vscode/launch.json
2727
/*.iml
28+
/.vs
2829

2930
# misc
3031
.DS_Store

src/cdk/tree/nested-node.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ import {getTreeControlFunctionsMissingError} from './tree-errors';
3939
{provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: CdkNestedTreeNode}
4040
]
4141
})
42-
export class CdkNestedTreeNode<T> extends CdkTreeNode<T> implements AfterContentInit, DoCheck,
43-
OnDestroy,
44-
OnInit {
42+
export class CdkNestedTreeNode<T, K = T> extends CdkTreeNode<T, K>
43+
implements AfterContentInit, DoCheck, OnDestroy, OnInit {
4544
/** Differ used to find the changes in the data provided by the data source. */
4645
private _dataDiffer: IterableDiffer<T>;
4746

@@ -57,7 +56,7 @@ export class CdkNestedTreeNode<T> extends CdkTreeNode<T> implements AfterContent
5756
nodeOutlet: QueryList<CdkTreeNodeOutlet>;
5857

5958
constructor(protected _elementRef: ElementRef<HTMLElement>,
60-
protected _tree: CdkTree<T>,
59+
protected _tree: CdkTree<T, K>,
6160
protected _differs: IterableDiffers) {
6261
super(_elementRef, _tree);
6362
// The classes are directly added here instead of in the host property because classes on

src/cdk/tree/padding.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const cssUnitPattern = /([A-Za-z%]+)$/;
2323
@Directive({
2424
selector: '[cdkTreeNodePadding]',
2525
})
26-
export class CdkTreeNodePadding<T> implements OnDestroy {
26+
export class CdkTreeNodePadding<T, K = T> implements OnDestroy {
2727
/** Current padding value applied to the element. Used to avoid unnecessarily hitting the DOM. */
2828
private _currentPadding: string|null;
2929

@@ -48,8 +48,8 @@ export class CdkTreeNodePadding<T> implements OnDestroy {
4848
set indent(indent: number | string) { this._setIndentInput(indent); }
4949
_indent: number = 40;
5050

51-
constructor(private _treeNode: CdkTreeNode<T>,
52-
private _tree: CdkTree<T>,
51+
constructor(private _treeNode: CdkTreeNode<T, K>,
52+
private _tree: CdkTree<T, K>,
5353
private _element: ElementRef<HTMLElement>,
5454
@Optional() private _dir: Directionality) {
5555
this._setPadding();

src/cdk/tree/toggle.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ import {CdkTree, CdkTreeNode} from './tree';
1515
* Node toggle to expand/collapse the node.
1616
*/
1717
@Directive({selector: '[cdkTreeNodeToggle]'})
18-
export class CdkTreeNodeToggle<T> {
18+
export class CdkTreeNodeToggle<T, K = T> {
1919
/** Whether expand/collapse the node recursively. */
2020
@Input('cdkTreeNodeToggleRecursive')
2121
get recursive(): boolean { return this._recursive; }
2222
set recursive(value: boolean) { this._recursive = coerceBooleanProperty(value); }
2323
protected _recursive = false;
2424

25-
constructor(protected _tree: CdkTree<T>,
26-
protected _treeNode: CdkTreeNode<T>) {}
25+
constructor(protected _tree: CdkTree<T, K>,
26+
protected _treeNode: CdkTreeNode<T, K>) {}
2727

2828
// We have to use a `HostListener` here in order to support both Ivy and ViewEngine.
2929
// In Ivy the `host` bindings will be merged when this class is extended, whereas in

src/cdk/tree/tree.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ import {coerceNumberProperty} from '@angular/cdk/coercion';
6969
// tslint:disable-next-line:validate-decorators
7070
changeDetection: ChangeDetectionStrategy.Default
7171
})
72-
export class CdkTree<T> implements AfterContentChecked, CollectionViewer, OnDestroy, OnInit {
72+
export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer, OnDestroy, OnInit {
7373
/** Subject that emits when the component has been destroyed. */
7474
private _onDestroy = new Subject<void>();
7575

@@ -100,7 +100,7 @@ export class CdkTree<T> implements AfterContentChecked, CollectionViewer, OnDest
100100
private _dataSource: DataSource<T> | Observable<T[]> | T[];
101101

102102
/** The tree controller */
103-
@Input() treeControl: TreeControl<T>;
103+
@Input() treeControl: TreeControl<T, K>;
104104

105105
/**
106106
* Tracking function that will be used to check the differences in data changes. Used similarly
@@ -303,7 +303,7 @@ export class CdkTree<T> implements AfterContentChecked, CollectionViewer, OnDest
303303
selector: 'cdk-tree-node',
304304
exportAs: 'cdkTreeNode',
305305
})
306-
export class CdkTreeNode<T> implements DoCheck, FocusableOption, OnDestroy, OnInit {
306+
export class CdkTreeNode<T, K = T> implements DoCheck, FocusableOption, OnDestroy, OnInit {
307307
/**
308308
* The role of the tree node.
309309
* @deprecated The correct role is 'treeitem', 'group' should not be used. This input will be
@@ -362,8 +362,8 @@ export class CdkTreeNode<T> implements DoCheck, FocusableOption, OnDestroy, OnIn
362362
}
363363

364364
constructor(protected _elementRef: ElementRef<HTMLElement>,
365-
protected _tree: CdkTree<T>) {
366-
CdkTreeNode.mostRecentTreeNode = this as CdkTreeNode<T>;
365+
protected _tree: CdkTree<T, K>) {
366+
CdkTreeNode.mostRecentTreeNode = this as CdkTreeNode<T, K>;
367367
// The classes are directly added here instead of in the host property because classes on
368368
// the host property are not inherited with View Engine. It is not set as a @HostBinding because
369369
// it is not set by the time it's children nodes try to read the class from it.

src/material/tree/node.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ const _MatTreeNodeMixinBase: HasTabIndexCtor & CanDisableCtor & typeof CdkTreeNo
4545
inputs: ['role', 'disabled', 'tabIndex'],
4646
providers: [{provide: CdkTreeNode, useExisting: MatTreeNode}]
4747
})
48-
export class MatTreeNode<T> extends _MatTreeNodeMixinBase<T>
48+
export class MatTreeNode<T, K = T> extends _MatTreeNodeMixinBase<T, K>
4949
implements CanDisable, DoCheck, HasTabIndex, OnInit, OnDestroy {
5050

5151

5252
constructor(protected _elementRef: ElementRef<HTMLElement>,
53-
protected _tree: CdkTree<T>,
53+
protected _tree: CdkTree<T, K>,
5454
@Attribute('tabindex') tabIndex: string) {
5555
super(_elementRef, _tree);
5656

@@ -107,8 +107,8 @@ export class MatTreeNodeDef<T> extends CdkTreeNodeDef<T> {
107107
{provide: CDK_TREE_NODE_OUTLET_NODE, useExisting: MatNestedTreeNode}
108108
]
109109
})
110-
export class MatNestedTreeNode<T> extends CdkNestedTreeNode<T> implements AfterContentInit, DoCheck,
111-
OnDestroy, OnInit {
110+
export class MatNestedTreeNode<T, K = T> extends CdkNestedTreeNode<T, K>
111+
implements AfterContentInit, DoCheck, OnDestroy, OnInit {
112112
@Input('matNestedTreeNode') node: T;
113113

114114
/** Whether the node is disabled. */
@@ -127,7 +127,7 @@ export class MatNestedTreeNode<T> extends CdkNestedTreeNode<T> implements AfterC
127127
private _tabIndex: number;
128128

129129
constructor(protected _elementRef: ElementRef<HTMLElement>,
130-
protected _tree: CdkTree<T>,
130+
protected _tree: CdkTree<T, K>,
131131
protected _differs: IterableDiffers,
132132
@Attribute('tabindex') tabIndex: string) {
133133
super(_elementRef, _tree, _differs);

src/material/tree/padding.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {Directive, Input} from '@angular/core';
1515
selector: '[matTreeNodePadding]',
1616
providers: [{provide: CdkTreeNodePadding, useExisting: MatTreeNodePadding}]
1717
})
18-
export class MatTreeNodePadding<T> extends CdkTreeNodePadding<T> {
18+
export class MatTreeNodePadding<T, K = T> extends CdkTreeNodePadding<T, K> {
1919

2020
/** The level of depth of the tree node. The padding will be `level * indent` pixels. */
2121
@Input('matTreeNodePadding')

src/material/tree/toggle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {Directive, Input} from '@angular/core';
1818
providers: [{provide: CdkTreeNodeToggle, useExisting: MatTreeNodeToggle}]
1919
})
2020
// tslint:disable-next-line: coercion-types
21-
export class MatTreeNodeToggle<T> extends CdkTreeNodeToggle<T> {
21+
export class MatTreeNodeToggle<T, K = T> extends CdkTreeNodeToggle<T, K> {
2222
@Input('matTreeNodeToggleRecursive')
2323
get recursive(): boolean { return this._recursive; }
2424
set recursive(value: boolean) {

src/material/tree/tree.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {MatTreeNodeOutlet} from './outlet';
4040
changeDetection: ChangeDetectionStrategy.Default,
4141
providers: [{provide: CdkTree, useExisting: MatTree}]
4242
})
43-
export class MatTree<T> extends CdkTree<T> {
43+
export class MatTree<T, K = T> extends CdkTree<T, K> {
4444
// Outlets within the tree's template where the dataNodes will be inserted.
4545
@ViewChild(MatTreeNodeOutlet, {static: true}) _nodeOutlet: MatTreeNodeOutlet;
4646
}

tools/public_api_guard/cdk/tree.d.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,30 @@ export declare abstract class BaseTreeControl<T, K = T> implements TreeControl<T
2020

2121
export declare const CDK_TREE_NODE_OUTLET_NODE: InjectionToken<{}>;
2222

23-
export declare class CdkNestedTreeNode<T> extends CdkTreeNode<T> implements AfterContentInit, DoCheck, OnDestroy, OnInit {
23+
export declare class CdkNestedTreeNode<T, K = T> extends CdkTreeNode<T, K> implements AfterContentInit, DoCheck, OnDestroy, OnInit {
2424
protected _children: T[];
2525
protected _differs: IterableDiffers;
2626
protected _elementRef: ElementRef<HTMLElement>;
27-
protected _tree: CdkTree<T>;
27+
protected _tree: CdkTree<T, K>;
2828
nodeOutlet: QueryList<CdkTreeNodeOutlet>;
29-
constructor(_elementRef: ElementRef<HTMLElement>, _tree: CdkTree<T>, _differs: IterableDiffers);
29+
constructor(_elementRef: ElementRef<HTMLElement>, _tree: CdkTree<T, K>, _differs: IterableDiffers);
3030
protected _clear(): void;
3131
ngAfterContentInit(): void;
3232
ngDoCheck(): void;
3333
ngOnDestroy(): void;
3434
ngOnInit(): void;
3535
protected updateChildrenNodes(children?: T[]): void;
36-
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkNestedTreeNode<any>, "cdk-nested-tree-node", ["cdkNestedTreeNode"], { "role": "role"; "disabled": "disabled"; "tabIndex": "tabIndex"; }, {}, ["nodeOutlet"]>;
37-
static ɵfac: i0.ɵɵFactoryDef<CdkNestedTreeNode<any>, never>;
36+
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkNestedTreeNode<any, any>, "cdk-nested-tree-node", ["cdkNestedTreeNode"], { "role": "role"; "disabled": "disabled"; "tabIndex": "tabIndex"; }, {}, ["nodeOutlet"]>;
37+
static ɵfac: i0.ɵɵFactoryDef<CdkNestedTreeNode<any, any>, never>;
3838
}
3939

40-
export declare class CdkTree<T> implements AfterContentChecked, CollectionViewer, OnDestroy, OnInit {
40+
export declare class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer, OnDestroy, OnInit {
4141
_nodeDefs: QueryList<CdkTreeNodeDef<T>>;
4242
_nodeOutlet: CdkTreeNodeOutlet;
4343
get dataSource(): DataSource<T> | Observable<T[]> | T[];
4444
set dataSource(dataSource: DataSource<T> | Observable<T[]> | T[]);
4545
trackBy: TrackByFunction<T>;
46-
treeControl: TreeControl<T>;
46+
treeControl: TreeControl<T, K>;
4747
viewChange: BehaviorSubject<{
4848
start: number;
4949
end: number;
@@ -55,37 +55,37 @@ export declare class CdkTree<T> implements AfterContentChecked, CollectionViewer
5555
ngOnDestroy(): void;
5656
ngOnInit(): void;
5757
renderNodeChanges(data: T[] | ReadonlyArray<T>, dataDiffer?: IterableDiffer<T>, viewContainer?: ViewContainerRef, parentData?: T): void;
58-
static ɵcmp: i0.ɵɵComponentDefWithMeta<CdkTree<any>, "cdk-tree", ["cdkTree"], { "dataSource": "dataSource"; "treeControl": "treeControl"; "trackBy": "trackBy"; }, {}, ["_nodeDefs"], never>;
59-
static ɵfac: i0.ɵɵFactoryDef<CdkTree<any>, never>;
58+
static ɵcmp: i0.ɵɵComponentDefWithMeta<CdkTree<any, any>, "cdk-tree", ["cdkTree"], { "dataSource": "dataSource"; "treeControl": "treeControl"; "trackBy": "trackBy"; }, {}, ["_nodeDefs"], never>;
59+
static ɵfac: i0.ɵɵFactoryDef<CdkTree<any, any>, never>;
6060
}
6161

6262
export declare class CdkTreeModule {
6363
static ɵinj: i0.ɵɵInjectorDef<CdkTreeModule>;
6464
static ɵmod: i0.ɵɵNgModuleDefWithMeta<CdkTreeModule, [typeof i1.CdkNestedTreeNode, typeof i2.CdkTreeNodeDef, typeof i3.CdkTreeNodePadding, typeof i4.CdkTreeNodeToggle, typeof i5.CdkTree, typeof i5.CdkTreeNode, typeof i6.CdkTreeNodeOutlet], never, [typeof i1.CdkNestedTreeNode, typeof i2.CdkTreeNodeDef, typeof i3.CdkTreeNodePadding, typeof i4.CdkTreeNodeToggle, typeof i5.CdkTree, typeof i5.CdkTreeNode, typeof i6.CdkTreeNodeOutlet]>;
6565
}
6666

67-
export declare class CdkTreeNode<T> implements DoCheck, FocusableOption, OnDestroy, OnInit {
67+
export declare class CdkTreeNode<T, K = T> implements DoCheck, FocusableOption, OnDestroy, OnInit {
6868
protected _data: T;
6969
_dataChanges: Subject<void>;
7070
protected _destroyed: Subject<void>;
7171
protected _elementRef: ElementRef<HTMLElement>;
7272
protected _isAriaExpanded: boolean;
73-
protected _tree: CdkTree<T>;
73+
protected _tree: CdkTree<T, K>;
7474
get data(): T;
7575
set data(value: T);
7676
get isExpanded(): boolean;
7777
get level(): number;
7878
get role(): 'treeitem' | 'group';
7979
set role(_role: 'treeitem' | 'group');
80-
constructor(_elementRef: ElementRef<HTMLElement>, _tree: CdkTree<T>);
80+
constructor(_elementRef: ElementRef<HTMLElement>, _tree: CdkTree<T, K>);
8181
protected _setRoleFromData(): void;
8282
focus(): void;
8383
ngDoCheck(): void;
8484
ngOnDestroy(): void;
8585
ngOnInit(): void;
8686
static mostRecentTreeNode: CdkTreeNode<any> | null;
87-
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkTreeNode<any>, "cdk-tree-node", ["cdkTreeNode"], { "role": "role"; }, {}, never>;
88-
static ɵfac: i0.ɵɵFactoryDef<CdkTreeNode<any>, never>;
87+
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkTreeNode<any, any>, "cdk-tree-node", ["cdkTreeNode"], { "role": "role"; }, {}, never>;
88+
static ɵfac: i0.ɵɵFactoryDef<CdkTreeNode<any, any>, never>;
8989
}
9090

9191
export declare class CdkTreeNodeDef<T> {
@@ -112,36 +112,36 @@ export declare class CdkTreeNodeOutletContext<T> {
112112
constructor(data: T);
113113
}
114114

115-
export declare class CdkTreeNodePadding<T> implements OnDestroy {
115+
export declare class CdkTreeNodePadding<T, K = T> implements OnDestroy {
116116
_indent: number;
117117
_level: number;
118118
get indent(): number | string;
119119
set indent(indent: number | string);
120120
indentUnits: string;
121121
get level(): number;
122122
set level(value: number);
123-
constructor(_treeNode: CdkTreeNode<T>, _tree: CdkTree<T>, _element: ElementRef<HTMLElement>, _dir: Directionality);
123+
constructor(_treeNode: CdkTreeNode<T, K>, _tree: CdkTree<T, K>, _element: ElementRef<HTMLElement>, _dir: Directionality);
124124
_paddingIndent(): string | null;
125125
protected _setIndentInput(indent: number | string): void;
126126
protected _setLevelInput(value: number): void;
127127
_setPadding(forceChange?: boolean): void;
128128
ngOnDestroy(): void;
129129
static ngAcceptInputType_level: NumberInput;
130-
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkTreeNodePadding<any>, "[cdkTreeNodePadding]", never, { "level": "cdkTreeNodePadding"; "indent": "cdkTreeNodePaddingIndent"; }, {}, never>;
131-
static ɵfac: i0.ɵɵFactoryDef<CdkTreeNodePadding<any>, [null, null, null, { optional: true; }]>;
130+
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkTreeNodePadding<any, any>, "[cdkTreeNodePadding]", never, { "level": "cdkTreeNodePadding"; "indent": "cdkTreeNodePaddingIndent"; }, {}, never>;
131+
static ɵfac: i0.ɵɵFactoryDef<CdkTreeNodePadding<any, any>, [null, null, null, { optional: true; }]>;
132132
}
133133

134-
export declare class CdkTreeNodeToggle<T> {
134+
export declare class CdkTreeNodeToggle<T, K = T> {
135135
protected _recursive: boolean;
136-
protected _tree: CdkTree<T>;
137-
protected _treeNode: CdkTreeNode<T>;
136+
protected _tree: CdkTree<T, K>;
137+
protected _treeNode: CdkTreeNode<T, K>;
138138
get recursive(): boolean;
139139
set recursive(value: boolean);
140-
constructor(_tree: CdkTree<T>, _treeNode: CdkTreeNode<T>);
140+
constructor(_tree: CdkTree<T, K>, _treeNode: CdkTreeNode<T, K>);
141141
_toggle(event: Event): void;
142142
static ngAcceptInputType_recursive: BooleanInput;
143-
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkTreeNodeToggle<any>, "[cdkTreeNodeToggle]", never, { "recursive": "cdkTreeNodeToggleRecursive"; }, {}, never>;
144-
static ɵfac: i0.ɵɵFactoryDef<CdkTreeNodeToggle<any>, never>;
143+
static ɵdir: i0.ɵɵDirectiveDefWithMeta<CdkTreeNodeToggle<any, any>, "[cdkTreeNodeToggle]", never, { "recursive": "cdkTreeNodeToggleRecursive"; }, {}, never>;
144+
static ɵfac: i0.ɵɵFactoryDef<CdkTreeNodeToggle<any, any>, never>;
145145
}
146146

147147
export declare class FlatTreeControl<T, K = T> extends BaseTreeControl<T, K> {

0 commit comments

Comments
 (0)