Skip to content

Commit 2777f26

Browse files
authored
Improve TColumnConfig typing on columns that extend TableColumnTextBase (#1997)
# Pull Request ## 🤨 Rationale Resolves #1964 ## 👩‍💻 Implementation `TableColumnTextBase` cannot simply be made generic because TypeScript doesn't support generics and mixins together: microsoft/TypeScript#26154. Therefore, each concrete instance of `TableColumnTextBase` should add its own mixins in a way that they get mixed into `TableColumnTextBase<TColumnConfig>` rather than `TableColumn`. To avoid code duplicate, I created a function, `mixinTextBase`, that mixes in the appropriate mixins for `TableColumnTextBase`. ## 🧪 Testing - Unit tests still pass - Manually verified that the type of `this.columnInternals.columnConfig` is correct for a column using `mixinTextBase` - Sanity tested examples in storybook to make sure columns still behave as expected ## ✅ Checklist <!--- Review the list and put an x in the boxes that apply or ~~strike through~~ around items that don't (along with an explanation). --> - [ ] I have updated the project documentation to reflect my changes or determined no changes are needed.
1 parent 96278de commit 2777f26

File tree

6 files changed

+42
-12
lines changed

6 files changed

+42
-12
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Improve TColumnConfig typing on columns that extend TableColumnTextBase",
4+
"packageName": "@ni/nimble-components",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/nimble-components/src/table-column/date-text/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { attr } from '@microsoft/fast-element';
66
import { styles } from '../base/styles';
77
import { template } from '../base/template';
88
import type { TableNumberField } from '../../table/types';
9-
import { TableColumnTextBase } from '../text-base';
9+
import { TableColumnTextBase, mixinTextBase } from '../text-base';
1010
import { TableColumnSortOperation, TableColumnValidity } from '../base/types';
1111
import { tableColumnDateTextGroupHeaderViewTag } from './group-header-view';
1212
import { tableColumnDateTextCellViewTag } from './cell-view';
@@ -49,7 +49,9 @@ declare global {
4949
/**
5050
* The table column for displaying dates/times as text.
5151
*/
52-
export class TableColumnDateText extends TableColumnTextBase {
52+
export class TableColumnDateText extends mixinTextBase(
53+
TableColumnTextBase<TableColumnDateTextColumnConfig>
54+
) {
5355
/** @internal */
5456
public validator = new TableColumnDateTextValidator(this.columnInternals);
5557

packages/nimble-components/src/table-column/duration-text/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import {
55
import { styles } from '../base/styles';
66
import { template } from '../base/template';
77
import type { TableNumberField } from '../../table/types';
8-
import { TableColumnTextBase } from '../text-base';
98
import { TableColumnSortOperation } from '../base/types';
109
import { tableColumnDurationTextCellViewTag } from './cell-view';
1110
import type { ColumnInternalsOptions } from '../base/models/column-internals';
1211
import { lang } from '../../theme-provider';
1312
import { DurationFormatter } from './models/duration-formatter';
1413
import { tableColumnDurationTextGroupHeaderViewTag } from './group-header-view';
1514
import type { TableColumnTextBaseColumnConfig } from '../text-base/cell-view';
15+
import { TableColumnTextBase, mixinTextBase } from '../text-base';
1616

1717
export type TableColumnDurationTextCellRecord = TableNumberField<'value'>;
1818
export interface TableColumnDurationTextColumnConfig
@@ -29,7 +29,9 @@ declare global {
2929
/**
3030
* The table column for displaying a duration value as text.
3131
*/
32-
export class TableColumnDurationText extends TableColumnTextBase {
32+
export class TableColumnDurationText extends mixinTextBase(
33+
TableColumnTextBase<TableColumnDurationTextColumnConfig>
34+
) {
3335
private readonly langSubscriber: DesignTokenSubscriber<typeof lang> = {
3436
handleChange: () => {
3537
this.updateColumnConfig();

packages/nimble-components/src/table-column/number-text/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { styles } from '../base/styles';
1414
import { template } from './template';
1515
import type { TableNumberField } from '../../table/types';
16-
import { TableColumnTextBase } from '../text-base';
16+
import { TableColumnTextBase, mixinTextBase } from '../text-base';
1717
import { TableColumnSortOperation, TableColumnValidity } from '../base/types';
1818
import { tableColumnNumberTextGroupHeaderTag } from './group-header-view';
1919
import { tableColumnNumberTextCellViewTag } from './cell-view';
@@ -44,7 +44,9 @@ declare global {
4444
/**
4545
* The table column for displaying numbers as text.
4646
*/
47-
export class TableColumnNumberText extends TableColumnTextBase {
47+
export class TableColumnNumberText extends mixinTextBase(
48+
TableColumnTextBase<TableColumnNumberTextColumnConfig>
49+
) {
4850
/** @internal */
4951
public validator = new TableColumnNumberTextValidator(this.columnInternals);
5052

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { attr } from '@microsoft/fast-element';
2-
import { mixinFractionalWidthColumnAPI } from '../mixins/fractional-width-column';
32
import { TableColumn } from '../base';
3+
import { mixinFractionalWidthColumnAPI } from '../mixins/fractional-width-column';
44
import { mixinGroupableColumnAPI } from '../mixins/groupable-column';
55
import { mixinColumnWithPlaceholderAPI } from '../mixins/placeholder';
66

77
/**
88
* The base class for table columns that display fields of any type as text.
99
*/
10-
export abstract class TableColumnTextBase extends mixinGroupableColumnAPI(
11-
mixinFractionalWidthColumnAPI(mixinColumnWithPlaceholderAPI(TableColumn))
12-
) {
10+
export abstract class TableColumnTextBase<
11+
TColumnConfig
12+
> extends TableColumn<TColumnConfig> {
1313
@attr({ attribute: 'field-name' })
1414
public fieldName?: string;
1515

@@ -18,3 +18,18 @@ export abstract class TableColumnTextBase extends mixinGroupableColumnAPI(
1818
this.columnInternals.operandDataRecordFieldName = this.fieldName;
1919
}
2020
}
21+
22+
type TableColumnBaseConstructor<TColumnConfig> = abstract new (
23+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
24+
...args: any[]
25+
) => TableColumnTextBase<TColumnConfig>;
26+
27+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/explicit-function-return-type, @typescript-eslint/no-explicit-any
28+
export function mixinTextBase<
29+
TBase extends TableColumnBaseConstructor<TColumnConfig>,
30+
TColumnConfig
31+
>(base: TBase) {
32+
return mixinGroupableColumnAPI(
33+
mixinFractionalWidthColumnAPI(mixinColumnWithPlaceholderAPI(base))
34+
);
35+
}

packages/nimble-components/src/table-column/text/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { DesignSystem } from '@microsoft/fast-foundation';
22
import { styles } from '../base/styles';
33
import { template } from '../base/template';
44
import type { TableStringField } from '../../table/types';
5-
import { TableColumnTextBase } from '../text-base';
5+
import { TableColumnTextBase, mixinTextBase } from '../text-base';
66
import { TableColumnSortOperation } from '../base/types';
77
import { tableColumnTextGroupHeaderViewTag } from './group-header-view';
88
import { tableColumnTextCellViewTag } from './cell-view';
@@ -24,7 +24,9 @@ declare global {
2424
/**
2525
* The table column for displaying string fields as text.
2626
*/
27-
export class TableColumnText extends TableColumnTextBase {
27+
export class TableColumnText extends mixinTextBase(
28+
TableColumnTextBase<TableColumnTextColumnConfig>
29+
) {
2830
public placeholderChanged(): void {
2931
this.columnInternals.columnConfig = {
3032
placeholder: this.placeholder

0 commit comments

Comments
 (0)