Skip to content

Commit 716cc02

Browse files
List: improve TS typing of decorators (DevExpress#30598)
Signed-off-by: Andrei Kharitonov <[email protected]> Co-authored-by: EugeniyKiyashko <[email protected]>
1 parent ef36f07 commit 716cc02

39 files changed

+1127
-837
lines changed

packages/devextreme/js/__internal/ui/collection/collection_widget.async.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { dxElementWrapper } from '@js/core/renderer';
33
import type { DeferredObj } from '@js/core/utils/deferred';
44
import { Deferred, when } from '@js/core/utils/deferred';
55
import type { ItemLike } from '@js/ui/collection/ui.collection_widget.base';
6-
import type { ItemRenderInfo } from '@ts/ui/collection/collection_widget.base';
6+
import type { CollectionItemKey, ItemRenderInfo } from '@ts/ui/collection/collection_widget.base';
77
import type { CollectionWidgetEditProperties } from '@ts/ui/collection/collection_widget.edit';
88
import CollectionWidgetEdit from '@ts/ui/collection/collection_widget.edit';
99

@@ -13,7 +13,7 @@ class CollectionWidgetAsync<
1313
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1414
TItem extends ItemLike = any,
1515
// eslint-disable-next-line @typescript-eslint/no-explicit-any
16-
TKey = any,
16+
TKey extends CollectionItemKey = any,
1717
> extends CollectionWidgetEdit<TProperties, TItem, TKey> {
1818
_asyncTemplateItemsMap!: Record<string, DeferredObj<unknown>>;
1919

packages/devextreme/js/__internal/ui/collection/collection_widget.base.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,22 @@ const FOCUS_LAST = 'last';
6868
const FOCUS_FIRST = 'first';
6969

7070
export type DataChangeType = 'insert' | 'update' | 'remove';
71-
export interface CollectionItemInfo<TItem, TIndex = number | { group: number; item: number }> {
71+
export interface CollectionItemInfo<TItem, TIndex = CollectionItemIndex> {
7272
readonly itemData: TItem;
7373
readonly itemElement: HTMLElement;
7474
readonly itemIndex: TIndex;
7575
}
7676

77+
export type CollectionItemKey = string | number;
78+
7779
export type ActionArgs<TItem> = CollectionItemInfo<TItem> | {
7880
cancel?: boolean;
7981
event?: DxEvent;
8082
fromIndex?: CollectionItemIndex;
8183
toIndex?: CollectionItemIndex;
8284
node?: PublicNode;
8385
};
84-
export interface DataChange<TItem = CollectionItem, TKey = number | string> {
86+
export interface DataChange<TItem = CollectionItem, TKey = CollectionItemKey> {
8587
key: TKey;
8688
type: DataChangeType;
8789
data: TItem;
@@ -117,9 +119,10 @@ export interface CollectionWidgetBaseProperties<
117119
TComponent extends CollectionWidget<any, TItem, TKey> | any,
118120
// eslint-disable-next-line @typescript-eslint/no-explicit-any
119121
TItem extends ItemLike = any,
120-
TKey = string | number,
122+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
123+
TKey extends CollectionItemKey = any,
121124
> extends CollectionWidgetOptions<TComponent, TItem, TKey> {
122-
focusedElement?: dxElementWrapper;
125+
focusedElement?: Element | null;
123126

124127
encodeNoDataText?: boolean;
125128

@@ -142,7 +145,7 @@ class CollectionWidget<
142145
// eslint-disable-next-line @typescript-eslint/no-explicit-any
143146
TItem extends ItemLike = any,
144147
// eslint-disable-next-line @typescript-eslint/no-explicit-any
145-
TKey = any,
148+
TKey extends CollectionItemKey = any,
146149
> extends Widget<TProperties> {
147150
private _focusedItemId?: string;
148151

@@ -217,6 +220,7 @@ class CollectionWidget<
217220

218221
_enterKeyHandler(e: DxEvent<KeyboardEvent>): void {
219222
const { focusedElement } = this.option();
223+
220224
const $itemElement = $(focusedElement);
221225

222226
if (!$itemElement.length) {
@@ -404,7 +408,6 @@ class CollectionWidget<
404408
}
405409

406410
const { focusedElement } = this.option();
407-
408411
const $focusedElement = $(focusedElement);
409412
if ($focusedElement.length) {
410413
// NOTE: If focusedElement is set, selection was already processed on its focusing.
@@ -434,7 +437,6 @@ class CollectionWidget<
434437

435438
_getActiveItem(last?: boolean): dxElementWrapper {
436439
const { focusedElement } = this.option();
437-
438440
const $focusedElement = $(focusedElement);
439441

440442
if ($focusedElement.length) {
@@ -1484,7 +1486,7 @@ class CollectionWidget<
14841486

14851487
_itemEventHandlerByHandler(
14861488
initiator: dxElementWrapper | Element,
1487-
handler: () => void,
1489+
handler: () => unknown,
14881490
actionArgs: ActionArgs<TItem>,
14891491
actionConfig?: ActionConfig,
14901492
): void {

packages/devextreme/js/__internal/ui/collection/collection_widget.edit.strategy.plain.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import type { dxElementWrapper } from '@js/core/renderer';
22
import type { ItemLike } from '@js/ui/collection/ui.collection_widget.base';
3+
import type { CollectionItemKey } from '@ts/ui/collection/collection_widget.base';
34
import type { CollectionItemIndex } from '@ts/ui/collection/collection_widget.edit.strategy';
45
import EditStrategy from '@ts/ui/collection/collection_widget.edit.strategy';
56

67
class PlainEditStrategy<
78
// eslint-disable-next-line @typescript-eslint/no-explicit-any
89
TItem extends ItemLike = any,
910
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10-
TKey = any,
11+
TKey extends CollectionItemKey = any,
1112
> extends EditStrategy<TItem, TKey> {
1213
_getPlainItems(): TItem[] {
1314
return this._getItems() ?? [];
1415
}
1516

16-
getIndexByItemData(itemData: TItem): number {
17+
getIndexByItemData(itemData: TItem): CollectionItemIndex {
1718
const keyOf = this._collectionWidget.keyOf.bind(this._collectionWidget);
1819
if (keyOf) {
1920
return this.getIndexByKey(keyOf(itemData));
@@ -61,7 +62,7 @@ class PlainEditStrategy<
6162
return -1;
6263
}
6364

64-
getItemsByKeys(keys: TKey[], items?: TItem[]): TItem[] {
65+
getItemsByKeys(keys: TKey[], items: TItem[] | undefined): TItem[] {
6566
return (items ?? keys).slice() as TItem[];
6667
}
6768

@@ -76,8 +77,8 @@ class PlainEditStrategy<
7677
items.splice(destinationIndex, 0, movedItemData);
7778
}
7879

79-
_isItemIndex(index: number | Element | TItem): boolean {
80-
return (typeof index === 'number') && Math.round(index) === index;
80+
_isItemIndex(index: CollectionItemIndex): index is CollectionItemIndex {
81+
return this._isNormalizedItemIndex(index);
8182
}
8283

8384
_getNormalizedItemIndex(itemElement: Element): number {

packages/devextreme/js/__internal/ui/collection/collection_widget.edit.strategy.ts

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@ import $ from '@js/core/renderer';
55
import { equalByValue } from '@js/core/utils/common';
66
import { isRenderer } from '@js/core/utils/type';
77
import type { ItemLike } from '@js/ui/collection/ui.collection_widget.base';
8+
import type { CollectionItemKey } from '@ts/ui/collection/collection_widget.base';
89
import type CollectionWidget from '@ts/ui/collection/collection_widget.edit';
910
import type { CollectionWidgetEditProperties } from '@ts/ui/collection/collection_widget.edit';
1011

11-
export type CollectionItemIndex = number | { group: number; item: number };
12+
export interface CollectionGroupedItemIndex {
13+
group: number;
14+
item: number;
15+
}
16+
17+
export type CollectionItemIndex = number | CollectionGroupedItemIndex;
1218

1319
export type EditStrategyComponent<
1420
TItem extends ItemLike = ItemLike,
1521
// eslint-disable-next-line @typescript-eslint/no-explicit-any
16-
TKey = any,
22+
TKey extends CollectionItemKey = any,
1723
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1824
> = Pick<CollectionWidget<CollectionWidgetEditProperties<any, TItem, TKey>, TItem, TKey>,
1925
'keyOf'
@@ -24,16 +30,15 @@ export type EditStrategyComponent<
2430
| '_dataController'
2531
>;
2632

27-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
28-
interface KeysCache<TKey = any> {
33+
interface KeysCache<TKey = CollectionItemKey> {
2934
[key: string]: unknown;
3035
keys?: TKey[];
3136
}
3237
class EditStrategy<
3338
// eslint-disable-next-line @typescript-eslint/no-explicit-any
3439
TItem extends ItemLike = any,
3540
// eslint-disable-next-line @typescript-eslint/no-explicit-any
36-
TKey = any,
41+
TKey extends CollectionItemKey = any,
3742
> {
3843
_collectionWidget!: EditStrategyComponent<TItem, TKey>;
3944

@@ -49,7 +54,7 @@ class EditStrategy<
4954
}
5055

5156
// eslint-disable-next-line @typescript-eslint/no-unused-vars
52-
getIndexByItemData(value: TItem): number {
57+
getIndexByItemData(value: TItem): CollectionItemIndex {
5358
return Class.abstract();
5459
}
5560

@@ -64,15 +69,15 @@ class EditStrategy<
6469
}
6570

6671
// eslint-disable-next-line @typescript-eslint/no-unused-vars
67-
getItemsByKeys(keys: TKey[], items?: TItem[]): TItem[] {
72+
getItemsByKeys(keys: TKey[], items: TItem[] | undefined): TItem[] {
6873
return Class.abstract();
6974
}
7075

7176
itemsGetter(): TItem[] {
7277
return Class.abstract();
7378
}
7479

75-
getKeyByIndex(index: number): TKey {
80+
getKeyByIndex(index: CollectionItemIndex): TKey {
7681
const resultIndex = this._denormalizeItemIndex(index);
7782

7883
return this.getKeysByItems([this.getItemDataByIndex(resultIndex as number)])[0];
@@ -99,57 +104,61 @@ class EditStrategy<
99104
}
100105

101106
getNormalizedIndex(
102-
value: number | Element | TItem,
107+
value: CollectionItemIndex | Element | dxElementWrapper | TItem,
103108
): number {
104-
if (this._isNormalizedItemIndex(value)) {
105-
return value as number;
106-
}
107-
108-
if (this._isItemIndex(value)) {
109-
return this._normalizeItemIndex(value as number);
110-
}
111-
112109
if (this._isNode(value)) {
113110
return this._getNormalizedItemIndex(value);
114111
}
115112

116-
return this._normalizeItemIndex(this.getIndexByItemData(value as TItem));
117-
}
118-
119-
getIndex(value: number | Element | TItem): CollectionItemIndex {
120113
if (this._isNormalizedItemIndex(value)) {
121-
return this._denormalizeItemIndex(value as number);
114+
return value;
122115
}
123116

124117
if (this._isItemIndex(value)) {
125-
return value as number;
118+
return this._normalizeItemIndex(value);
126119
}
127120

121+
return this._normalizeItemIndex(this.getIndexByItemData(value));
122+
}
123+
124+
getIndex(value: CollectionItemIndex | Element | TItem): CollectionItemIndex {
128125
if (this._isNode(value)) {
129126
return this._denormalizeItemIndex(this._getNormalizedItemIndex(value));
130127
}
131128

132-
return this.getIndexByItemData(value as TItem);
133-
}
134-
135-
getItemElement(value: Element | number | TItem): dxElementWrapper {
136129
if (this._isNormalizedItemIndex(value)) {
137-
return this._getItemByNormalizedIndex(value as number);
130+
return this._denormalizeItemIndex(value);
138131
}
139132

140133
if (this._isItemIndex(value)) {
141-
return this._getItemByNormalizedIndex(this._normalizeItemIndex(value as number));
134+
return value;
142135
}
143136

137+
return this.getIndexByItemData(value);
138+
}
139+
140+
getItemElement(
141+
value: Element | dxElementWrapper | CollectionItemIndex | TItem,
142+
): dxElementWrapper {
144143
if (this._isNode(value)) {
145144
return $(value);
146145
}
147146

148-
const normalizedItemIndex = this._normalizeItemIndex(this.getIndexByItemData(value as TItem));
147+
if (this._isNormalizedItemIndex(value)) {
148+
return this._getItemByNormalizedIndex(value);
149+
}
150+
151+
if (this._isItemIndex(value)) {
152+
return this._getItemByNormalizedIndex(this._normalizeItemIndex(value));
153+
}
154+
155+
const normalizedItemIndex = this._normalizeItemIndex(this.getIndexByItemData(value));
149156
return this._getItemByNormalizedIndex(normalizedItemIndex);
150157
}
151158

152-
_isNode(el: unknown): el is Element {
159+
_isNode(
160+
el: CollectionItemIndex | TItem | Element | dxElementWrapper,
161+
): el is Element | dxElementWrapper {
153162
return domAdapter.isNode(el && isRenderer(el) ? (el as dxElementWrapper).get(0) : el);
154163
}
155164

@@ -167,34 +176,37 @@ class EditStrategy<
167176
return Class.abstract();
168177
}
169178

170-
_isNormalizedItemIndex(index: number | Element | TItem): boolean {
179+
_isNormalizedItemIndex(
180+
index: CollectionItemIndex | TItem,
181+
): index is number {
171182
return (typeof index === 'number') && Math.round(index) === index;
172183
}
173184

174-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
175-
_isItemIndex(index: number | Element | TItem): boolean {
185+
_isItemIndex(
186+
index: CollectionItemIndex | TItem,
187+
): index is CollectionItemIndex {
176188
return Class.abstract();
177189
}
178190

179191
_getNormalizedItemIndex(
180192
// eslint-disable-next-line @typescript-eslint/no-unused-vars
181-
value: Element,
193+
value: Element | dxElementWrapper,
182194
): number {
183195
return Class.abstract();
184196
}
185197

186198
// eslint-disable-next-line @typescript-eslint/no-unused-vars
187-
_normalizeItemIndex(index: number): number {
199+
_normalizeItemIndex(index: CollectionItemIndex): number {
188200
return Class.abstract();
189201
}
190202

191203
// eslint-disable-next-line @typescript-eslint/no-unused-vars
192-
_denormalizeItemIndex(index: number): CollectionItemIndex {
204+
_denormalizeItemIndex(index: CollectionItemIndex): CollectionItemIndex {
193205
return Class.abstract();
194206
}
195207

196208
// eslint-disable-next-line @typescript-eslint/no-unused-vars
197-
_getItemByNormalizedIndex(index: number): dxElementWrapper {
209+
_getItemByNormalizedIndex(index: CollectionItemIndex): dxElementWrapper {
198210
return Class.abstract();
199211
}
200212

0 commit comments

Comments
 (0)